TGViewer
مسعود بیگی مسعود بیگی @tondtech · 2.9K subscribers
Post #4044 1.06K

Forwarded from EverCode

تا حالا شده بخواین یه API برای Get کردن یه مدل بزنین؟ مثلا برای گرفتن محصولات یه فروشگاه. توی اینجور سرویس‌ها معمولا با یه سری نیازمندی‌ها روبرو میشیم. برای مثال:
- نیاز داریم تا بتونیم مشخص کنیم چه فیلدهایی از مدل رو برگردونیم، یعنی مثلا توی درخواستمون بگیم فقط نام و کد ملی کاربر برگرده
- نیاز به pagination داشته باشیم
- نیاز به sort داریم
بصورت کلی تر بخوایم بگیم، وقتی نیاز داریم سرویسمون عملا برابر دسترسی Read برای یه Table توی دیتابیس باشه.
یه راه اینه که خودمون همه چی رو پیاده سازی کنیم، اما راه دیگه‌ای هم هست. میتونیم از پروتوکل OData (OpenData) استفاده کنیم.
یک پروتوکل برمبنای REST که قواعد مشخصی رو برای کوئری کردن دیتا تعریف میکنه. برای مثال برای گرفتن یوزر، طوری که نیاز داریم فقط یه سری ستون خاص رو بگیریم، یه Sort بزنیم روش، و فیلتر کنیم کوئری‌مون یه همچین چیزی میشه:
GET /odata/Users?$select=id,displayName,email&$filter=status eq 'active' and age ge 18&$orderby=displayName asc&$top=50&$skip=0
البته به کوئری ختم نمیشه و کلی کارهای دیگه میشه توی Body درخواست انجام داد.
میتونید اینجا کمی بیشتر راجبش بخونید:
https://www.odata.org/getting-started/basic-tutorial/

حالا چجوری توی دات نت یه سرور OData راه بندازیم؟
* پروژه رو با استفاده از EFCore به دیتابیس وصل میکنیم.
* پکیج Microsoft.AspNetCore.OData رو نصب میکنیم
* توی Program.cs ستاپ میکنیم:
c#
var modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<User>("Users");

builder.Services.AddControllers()
.AddOData(options => options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(100)
.AddRouteComponents("odata", modelBuilder.GetEdmModel()));


* کنترلرمون رو بجای ControllerBase با ODataController میسازیم و برای هر مدلی که میخوایم OData براش داشته باشیم دوتا متد Get یکی برای همه رکوردها و یکی برای گرفتن با Id میسازیم:

c#
public class UsersController(ApplicationDbContext context) : ODataController
{

[EnableQuery]
public IActionResult Get()
{
return Ok(context.Users.OrderByDescending(o => o.CreatedOn));
}

[EnableQuery]
public IActionResult Get([FromRoute] Guid key)
{
var saga = context.Users.FirstOrDefault(s => s.Id == key);
return saga == null ? NotFound() : Ok(saga);
}

}


اگر دقت کنید، وقتی که با DbContext داریم کاربرها رو برمیگردونیم، متد ToList رو صدا نزدیم. نمیخوایم که کوئری رو انجام بدیم، اون قسمت رو پکیج OData انجام میده برامون.
بعد این مراحل سرور OData آماده‌ست و میتونین هرنوع کوئری که نیاز دارین رو روی اون دیتا انجام بدین، pagination داشته باشین، sort کنین و خیلی بیشتر.

@ever_code
www.odata.org Basic Tutorial · OData - the Best Way to REST OData, short for Open Data Protocol, is an open protocol to allow the creation and consumption of queryable and interoperable RESTful APIs in a simple and standard way.
  • 👍 2
  • ❤ 1
More from @tondtech
  1. Oct 13, 2026سلام سلام یه مجموعه استارتاپی رو به رشد در زمینه املاک که برای دوستانم هست، دو موقعیت شغلی…
  2. Oct 13, 2026☑️ اخبار مهم 21 مهر 🎙 رادیو شب‌گفتار: بررسی تحولات هوش مصنوعی متا، بهینه‌سازی لاگ‌های کلا…
  3. Oct 12, 2026رفتیم روی AIR ایلیا فتاحی هم الان اضافه میشه بهمون
  4. Oct 12, 2026کسی دوست داره توی یک گفتگو رادیویی بیاد الان صحبت کنیم ؟
  5. Oct 12, 2026🕵️‍♂️یه گفتگو لو رفته در پستوهای اطراف چند تا از استارتاپ های مثلا بزرگ مون که درگیر جناح…
  6. Oct 12, 2026از این به بعد میتونید هر روز یه 15 دقیقه درباره تازه های دنیای فناوری و تک بشنوید که Agent…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →