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:

TypeProsConsUse Case
EagerSingle query, no N+1 problemCan over-fetch dataKnown data needs
LazyLoad only what's neededN+1 problem, requires open connectionExploratory operations
ExplicitFine-grained controlMore code, manual managementConditional loading

Related Resources