Это может быть действительно элементарный вопрос, но какой хороший способ включить несколько дочерних объектов при написании запроса, который охватывает ТРИ уровня (или больше)?
то есть у меня есть 4 таблицы: Company
, Employee
, Employee_Car
иEmployee_Country
Компания имеет отношения 1: m с Сотрудником.
Сотрудник имеет отношения 1: m с Employee_Car и Employee_Country.
Если я хочу написать запрос, который возвращает данные из всех 4 таблиц, я сейчас пишу:
Company company = context.Companies
.Include("Employee.Employee_Car")
.Include("Employee.Employee_Country")
.FirstOrDefault(c => c.Id == companyID);
Должен быть более элегантный способ! Это многословно и генерирует ужасный SQL
Я использую EF4 с VS 2010
linq
entity-framework
lazy-loading
Натан Лю
источник
источник
//inside public static class Extensions public static IQueryable<Company> CompleteCompanies(this DbSet<Company> table){ return table .Include("Employee.Employee_Car") .Include("Employee.Employee_Country") ; } //code will be... Company company = context.Companies.CompleteCompanies().FirstOrDefault(c => c.Id == companyID); //same for next advanced method
EF 4.1 до EF 6
Существует строго типизированный тип,
.Include
который позволяет задавать необходимую глубину активной загрузки, предоставляя выражения Select на соответствующую глубину:Sql, сгенерированный в обоих случаях, отнюдь не интуитивно понятен, но кажется достаточно производительным. Я положил небольшой пример на GitHub здесь
EF Core
EF Core имеет новый метод расширения
.ThenInclude()
, хотя синтаксис немного отличается :Согласно документам, я бы сохранил дополнительный «отступ»,
.ThenInclude
чтобы сохранить ваше здравомыслие.Устаревшая информация (не делайте этого):
Многократная загрузка внуков могла бы быть сделана за один шаг, но это требует довольно неловкого обращения к графику, прежде чем отправиться вниз по следующему узлу (NB: Это НЕ работает
AsNoTracking()
- вы получите ошибку времени выполнения):Таким образом, я бы остановился на первом варианте (один параметр «Включить для каждой модели глубины сущности»).
источник
Вы можете найти эту интересную статью, которая доступна на codeplex.com .
В статье представлен новый способ выражения запросов, охватывающих несколько таблиц, в форме декларативных графовых форм.
Кроме того, статья содержит подробное сравнение производительности этого нового подхода с запросами EF. Этот анализ показывает, что GBQ быстро превосходит запросы EF.
источник
Как создать запрос LINQ to Entities для прямой загрузки дочерних объектов вместо вызова свойства Reference или Load ()
Другого пути нет - кроме реализации отложенной загрузки.
Или ручная загрузка ....
источник
Может быть, это поможет кому-то, 4 уровня и 2 ребенка на каждом уровне
источник