CodeShot

Lazy Loading در مقابل Eager Loading

Lazy Loading در ORM بارگذاری داده‌های وابسته (Related Entities) را تا زمان دسترسی واقعی به آن‌ها به تعویق می‌اندازد و در پس‌زمینه یک query جداگانه اجرا می‌کند؛ Eager Loading تمام داده‌های وابسته موردنیاز را از همان ابتدا و معمولاً در یک query واحد (با JOIN) بارگذاری می‌کند.

ویژگیLazy LoadingEager Loading
زمان بارگذاریهنگام دسترسی واقعیبلافاصله همراه موجودیت اصلی
تعداد Queryچندگانه (ریسک N+1)معمولاً یک Query با JOIN
ریسک اصلیبارگذاری تأخیری غیرمنتظره و کندبارگذاری داده اضافی غیرضروری
نیاز به کد اضافهفعال‌سازی Proxy/virtual propertiesفراخوانی صریح Include

کِی از Lazy Loading استفاده کنیم؟

وقتی مطمئن نیستید داده‌های وابسته واقعاً استفاده می‌شوند یا سناریوهای مختلف نیاز متفاوتی به آن‌ها دارند، Lazy Loading می‌تواند از بارگذاری غیرضروری داده جلوگیری کند — اما باید مراقب مشکل N+1 باشید.

کِی از Eager Loading استفاده کنیم؟

وقتی از قبل می‌دانید به داده‌های وابسته نیاز خواهید داشت (مثلاً نمایش سفارش همراه با اقلام آن در یک صفحه)، از Eager Loading استفاده کنید تا با یک query واحد و کارآمد همه داده لازم را بگیرید.

مثال Lazy Loading

var order = context.Orders.Find(orderId);
// Separate query fires here, only when accessed:
var items = order.OrderItems.ToList();

مثال Eager Loading

var order = context.Orders
    .Include(o => o.OrderItems)
    .FirstOrDefault(o => o.Id == orderId);
// OrderItems already loaded in the same query, via JOIN

اشتباه رایج

پیمایش یک لیست از موجودیت‌ها با Lazy Loading فعال و دسترسی به یک navigation property داخل حلقه، که باعث اجرای یک query جداگانه برای هر آیتم می‌شود (مشکل کلاسیک N+1) — راه‌حل، استفاده از Eager Loading با Include از قبل است.

جمع‌بندی

اگر از قبل می‌دانید داده وابسته لازم است، Eager Loading کنید؛ Lazy Loading را فقط برای دسترسی‌های نادر و غیرقطعی نگه دارید و مراقب N+1 باشید.