CodeShot
Performance1 دقیقه مطالعه

بهبود کارایی EF Core چطور انجام می‌شود؟

مجموعه‌ای از تکنیک‌های عملی (AsNoTracking، Include هدفمند، Compiled Query) برای کاهش زمان اجرا و مصرف حافظه Queryهای EF Core.

چرا مهم است؟

EF Core راحتی نوشتن Query را می‌دهد، اما استفاده پیش‌فرض و بدون‌فکر از آن می‌تواند در مقیاس واقعی (هزاران رکورد) به‌شدت کند شود؛ چند اصل ساده اغلب تفاوت چند برابری در سرعت ایجاد می‌کند.

تکنیک‌های کلیدی

  • AsNoTracking() برای Queryهای فقط‌خواندنی: غیرفعال‌کردن Change Tracker برای لیست‌ها/گزارش‌ها که قرار نیست Update شوند.
  • Select به‌جای بارگذاری کامل Entity: فقط ستون‌های موردنیاز را بخوانید:
    var names = await context.Products.Select(p => p.Name).ToListAsync();
    
  • Pagination با Skip/Take: هیچ‌وقت کل جدول را برای نمایش صفحه‌بندی‌شده نخوانید.
  • جلوگیری از N+1: با Include هدفمند، نه پیمایش حلقه‌ای.

مثال مقایسه

// کند: کل Entity + Tracking غیرضروری برای یک لیست نمایشی
var products = await context.Products.ToListAsync();

// سریع‌تر: فقط ستون لازم، بدون Tracking
var products = await context.Products
    .AsNoTracking()
    .Select(p => new { p.Id, p.Name })
    .ToListAsync();

اشتباه رایج

❌ اجرای منطق فیلتر روی داده بعد از ToListAsync() (یعنی در حافظه C#) به‌جای قبل از آن — این کار کل جدول را از دیتابیس می‌کشد و فیلتر واقعی در برنامه انجام می‌شود؛ همیشه شرط Where را قبل از Materialize کردن (ToListAsync) بنویسید تا دیتابیس فیلتر کند.

منبع و مطالعه بیشتر

خلاصه

کارایی EF Core با AsNoTracking برای Queryهای فقط‌خواندنی، Select هدفمند به‌جای Entity کامل، و Pagination بهبود می‌یابد. همیشه فیلتر (Where) را قبل از ToListAsync بنویسید تا در دیتابیس اجرا شود، نه در حافظه برنامه. مرجع کامل: Efficient Querying در EF Core، Microsoft Learn.

این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←