В чем различия между Include и ThenInclude в Entity Framework Core?

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

Ответ

Include и ThenInclude — это методы в Entity Framework Core для жадной загрузки связанных данных (Eager Loading). Их основное различие — в уровне вложенности навигационных свойств, которые они загружают.

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

Практический пример:

// Загружаем Customers, их заказы (Orders) и детали каждого заказа (OrderDetails)
var customersWithOrders = context.Customers
    .Include(c => c.Orders)           // Первый уровень: заказы клиента
    .ThenInclude(o => o.OrderDetails) // Второй уровень: детали заказа
    .ToList();

Ключевые правила:

  1. Include можно использовать самостоятельно.
  2. ThenInclude обязательно должен следовать после Include или другого ThenInclude.
  3. Порядок вызовов определяет путь загрузки: от корневого объекта к вложенным.
  4. Без ThenInclude в примере выше коллекция OrderDetails в каждом заказе осталась бы null или пустой (если не включена ленивая загрузка).