Ответ
Метод Include в Entity Framework Core реализует стратегию жадной загрузки (Eager Loading). Он указывает EF Core включить связанные данные (навигационные свойства) в один SQL-запрос, чтобы избежать проблемы N+1 запроса, возникающей при ленивой загрузке.
Проблема (без Include):
// Первый запрос: получаем всех клиентов
var customers = context.Customers.ToList();
// Для КАЖДОГО клиента выполняется отдельный запрос к БД для загрузки его заказов (N запросов).
foreach (var cust in customers)
{
var orders = cust.Orders.ToList(); // Ленивая загрузка -> новый запрос
}
// Итого: 1 (клиенты) + N (заказы) запросов.
Решение (с Include):
// Один оптимизированный SQL-запрос с JOIN или несколькими SELECT.
var customersWithOrders = context.Customers
.Include(c => c.Orders) // Жадно загружаем заказы
.ToList();
// Все данные (клиенты и их заказы) уже в памяти. Дополнительных запросов нет.
Расширенные возможности:
- Цепочка Include: Можно загружать несколько навигационных свойств.
var data = context.Customers .Include(c => c.Orders) .Include(c => c.Address) .ToList(); - Загрузка вложенных свойств (ThenInclude): Для загрузки связанных данных "второго уровня".
var data = context.Customers .Include(c => c.Orders) .ThenInclude(o => o.OrderDetails) // Загружаем детали каждого заказа .ToList();
Производительность и предостережения:
- Плюс: Резко сокращает количество обращений к БД, что критично для производительности.
- Минус: Может привести к избыточной выборке данных (over-fetching), если включено слишком много связей, особенно с большим объемом данных. В таких случаях стоит рассмотреть:
- Явная загрузка (
Load). - Проецирование (Select) в анонимный тип или DTO, содержащий только нужные поля.
- Раздельные запросы для сложных графов объектов.
- Явная загрузка (