TGViewer
EverCode EverCode @ever_code · 253 subscribers
Post #146 1.43K
تا حالا شده بخواین یه 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.
  • ❤ 3
More from @ever_code
  1. Oct 10, 2026اولین بار که با مفهوم سیستم عامل بصورت درست آشنا شدم، دوره ی خیلی قدیمی جادی برای LPIC 1 ب…
  2. Oct 9, 2026https://claude.ai/artifact/SQQRuCYtcH9RyBY1ZfWaXg برای ادامه دادن مبحث shader programming…
  3. Oct 9, 2026بیاین یکم بیشتر روی گرافیک تمرکز کنیم. این تصویر: https://www.shadertoy.com/embed/XsXXDn?g…
  4. Oct 9, 2026واقعا خیلی زیبا درس میده بنظرم
  5. Oct 9, 2026یه سری شاخه های کامپیوتر دقیقا اون جاهایی هستن که ما میگفتیم مگه ریاضی کجا تو زندگی به درد…
  6. Oct 8, 2026شرکت Stripe چند وقتی میشه که به یکی از شرکت های مورد علاقم تبدیل شده. یکی از بزرگترین شرکت…
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 →