Методы Include
ThenInclude (для последующих навигационных свойств) применяются для обхода навигационных свойств в запросах LINQ. Если отношение является обязательным, тогда механизм трансляции LINQ создаст внутреннее соединение. Если же отношение необязательное, то механизм трансляции создаст левое соединение.Например, чтобы загрузить все записи Car
Make, запустите следующий запрос LINQ:var queryable = Context.Cars.IgnoreQueryFilters.Include(
c => c.MakeNavigation).ToList;
Предыдущий запрос LINQ выполняет в отношении базы данных такой запрос:
SELECT [i].[Id], [i].[Color], [i].[MakeId], [i].[PetName], [i].[TimeStamp],
[m].[Id], [m].[Name], [m].[TimeStamp]
FROM [Dbo].[Inventory] AS [i]
INNER JOIN [dbo].[Makes] AS [m] ON [i].[MakeId] = [m].[Id]
В одном запросе можно использовать множество вызовов Include
ThenInclude после Include. Скажем, для получения всех записей Cars со связанной информацией Make и Order, а также информацией Customer, связанной с Order, используйте показанный ниже оператор:var cars = Context.Cars.Where(c => c.Orders.Any)
.Include(c => c.MakeNavigation)
.Include(c => c.Orders).ThenInclude(o => o.CustomerNavigation).ToList;
Фильтрованные включаемые данные
В версии EF Core 5 появилась возможность фильтрации и сортировки включаемых данных. Допустимыми операциями при навигации по коллекции являются Where
OrderBy, OrderByDescending, ThenBy, ThenByDescending, Skip и Take. Например, если нужно получить все записи Make, но только со связанными записями Car с желтым цветом, тогда вы организуете фильтрацию навигационного свойства в лямбда-выражении такого вида:var query = Context.Makes
.Include(x => x.Cars.Where(x=>x.Color == "Yellow")).ToList;
В результате запустится следующий запрос:
SELECT [m].[Id], [m].[Name], [m].[TimeStamp], [t].[Id], [t].[Color],
[t].[MakeId], [t].[PetName], [t].[TimeStamp]
FROM [dbo].[Makes] AS [m]
LEFT JOIN (
SELECT [i].[Id], [i].[Color], [i].[MakeId], [i].[PetName], [i].[TimeStamp]
FROM [Dbo].[Inventory] AS [i]
WHERE [i].[Color] = N'Yellow') AS [t] ON [m].[Id] = [t].[MakeId]
ORDER BY [m].[Id], [t].[Id]
Энергичная загрузка с разделением запросов
Наличие в запросе LINQ множества вызовов Include
AsSplitQuery, можно ожидать, что предыдущий запрос будет представлен в виде множества запросов SQL:var query = Context.Makes.AsSplitQuery
.Include(x => x.Cars.Where(x=>x.Color == "Yellow")).ToList;
Вот как выглядят выполняемые запросы:
SELECT [m].[Id], [m].[Name], [m].[TimeStamp]
FROM [dbo].[Makes] AS [m]
ORDER BY [m].[Id]
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT