В Entity Framework, метод Include реализует жадную, ленивую или явную загрузку?

«В Entity Framework, метод Include реализует жадную, ленивую или явную загрузку?» — вопрос из категории Entity Framework, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод Include в Entity Framework реализует жадную загрузку (Eager Loading).

Принцип работы: При выполнении запроса к основной сущности, связанные данные, указанные в Include, загружаются немедленно в рамках одного (или нескольких, если требуется ThenInclude) запроса к базе данных.

Пример:

using (var context = new AppDbContext())
{
    // Загружаем заказы и ВСЕ связанные с ними позиции одним запросом
    var orders = context.Orders
        .Include(o => o.OrderItems) // Жадная загрузка
        .ToList();
}

Сравнение с другими стратегиями:

  • Ленивая загрузка (Lazy Loading): Данные загружаются автоматически при первом обращении к свойству навигации. Требует настройки (например, виртуальных свойств) и может привести к проблеме N+1 запроса.
  • Явная загрузка (Explicit Loading): Данные загружаются по требованию с помощью явного вызова Load(). Полезно, когда неизвестно на этапе составления запроса, понадобятся ли связанные данные.
    var order = context.Orders.First();
    context.Entry(order)
        .Collection(o => o.OrderItems)
        .Load(); // Явная загрузка

Плюсы жадной загрузки: Предсказуемость (все данные загружены сразу) и эффективность (избегание множественных запросов N+1). Минусы: Риск избыточной выборки данных, особенно при цепочке Include/ThenInclude или загрузке больших графов объектов.