Lazy Loading در مقابل Eager Loading
Lazy Loading در ORM بارگذاری دادههای وابسته (Related Entities) را تا زمان دسترسی واقعی به آنها به تعویق میاندازد و در پسزمینه یک query جداگانه اجرا میکند؛ Eager Loading تمام دادههای وابسته موردنیاز را از همان ابتدا و معمولاً در یک query واحد (با JOIN) بارگذاری میکند.
| ویژگی | Lazy Loading | Eager 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 باشید.
