بهبود کارایی 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.
