What is the difference between eager loading, lazy loading, and explicit loading?
4 minintermediateEF-Coreloadingperformance
Quick Answer
Eager loading fetches related data up front in one query with `Include()`/`ThenInclude()`. Lazy loading defers loading related data until the navigation property is first accessed (requires proxies), which can cause hidden N+1 queries. Explicit loading loads related data on demand via `Entry(...).Collection/Reference(...).Load()`. Prefer eager/explicit loading to keep query behavior predictable.
Detailed Answer
1. Eager Loading
Load related data as part of the initial query using Include().
// Single level
var orders = context.Orders
.Include(o => o.Customer)
.ToList();
// Multiple levels
var orders = context.Orders
.Include(o => o.Customer)
.Include(o => o.OrderItems)
.ThenInclude(oi => oi.Product)
.ToList();
2. Lazy Loading
Related data is automatically loaded when accessed. Requires Microsoft.EntityFrameworkCore.Proxies.
// Enable lazy loading
services.AddDbContext(options =>
options.UseLazyLoadingProxies()
.UseSqlServer(connectionString));
// Make navigation properties virtual
public class Order
{
public int Id { get; set; }
public virtual Customer Customer { get; set; }
public virtual ICollection OrderItems { get; set; }
}
// Data loaded when accessed
var order = context.Orders.First();
var customerName = order.Customer.Name; // Triggers database query
3. Explicit Loading
Manually load related data when needed using Load().
var order = context.Orders.First();
// Load single reference
context.Entry(order)
.Reference(o => o.Customer)
.Load();
// Load collection
context.Entry(order)
.Collection(o => o.OrderItems)
.Load();
// Load with filter
context.Entry(order)
.Collection(o => o.OrderItems)
.Query()
.Where(oi => oi.Quantity > 5)
.Load();
Comparison:
| Type | Pros | Cons | Use Case |
|---|---|---|---|
| Eager | Single query, no N+1 problem | Can over-fetch data | Known data needs |
| Lazy | Load only what's needed | N+1 problem, requires open connection | Exploratory operations |
| Explicit | Fine-grained control | More code, manual management | Conditional loading |