Метод Include () хорошо работает для списков объектов. Но что, если мне нужно пройти два уровня? Например, метод ниже вернет ApplicationServers с включенными свойствами, показанными здесь. Однако ApplicationsWithOverrideGroup - это другой контейнер, который содержит другие сложные объекты. Могу ли я сделать функцию Include () для этого свойства? Или как я могу получить это свойство для полной загрузки?
В нынешнем виде этот метод:
public IEnumerable<ApplicationServer> GetAll()
{
return this.Database.ApplicationServers
.Include(x => x.ApplicationsWithOverrideGroup)
.Include(x => x.ApplicationWithGroupToForceInstallList)
.Include(x => x.CustomVariableGroups)
.ToList();
}
Заполняет только свойство Enabled (ниже), но не свойства Application или CustomVariableGroup (ниже). Как мне это сделать?
public class ApplicationWithOverrideVariableGroup : EntityBase
{
public bool Enabled { get; set; }
public Application Application { get; set; }
public CustomVariableGroup CustomVariableGroup { get; set; }
}
c#
entity-framework
eager-loading
Боб Хорн
источник
источник
Expression must be a member expression
при попытке это: Для того, чтобы включать в себя коллекцию , а затем уровень сбора один вниз:query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection))
.Ответы:
Для EF 6
Не забудьте добавить,
using System.Data.Entity;
чтобы получить версию,Include
которая принимает в лямбду.Для EF Core
Используйте новый метод
ThenInclude
источник
Include
для каждого свойства:Db.States.Include(state => state.Cities.Select(city => city.Customers).Include(state => state.Cities.Select(city => city.Vendors)
Если я вас правильно понимаю, вы спрашиваете о включении вложенных свойств. Если так :
или
или
источник
Include(string path)
версию метода.EF Core: использование «ThenInclude» для загрузки нескольких уровней: например:
источник
Я сделал небольшой помощник для Entity Framework 6 (стиль .Net Core), чтобы красиво включать под-сущности.
Сейчас на NuGet: Install-Package ThenInclude.EF6
Пакет доступен на GitHub .
источник
DbSet<One>().Include(x => x.Two.Three.Four.Five.Six)
с единственным недостатком, заключающимся в том, что вы вычисляете декартово произведение и потенциально увеличиваете пропускную способность.Другие примеры EFCore на MSDN показывают, что вы можете делать довольно сложные вещи с
Include
иThenInclude
.Это хороший пример того, насколько сложным вы можете стать (это все одно утверждение!):
Посмотрите, как вы можете цепляться
Include
даже после,ThenInclude
и это как бы «сбрасывает» вас обратно на уровень сущности верхнего уровня (Инструкторы).Вы даже можете повторять одну и ту же коллекцию «первого уровня» (CourseAssignments) несколько раз, а затем использовать отдельные
ThenIncludes
команды для доступа к различным дочерним объектам.Обратите внимание, что ваш фактический запрос должен быть помечен в конце цепочки
Include
илиThenIncludes
. Следующее НЕ работает:Настоятельно рекомендую настроить ведение журнала и убедиться, что ваши запросы не вышли из-под контроля, если вы включаете более одной или двух вещей. Важно увидеть, как это работает на самом деле - и вы заметите, что каждое отдельное «включение» обычно является новым запросом, чтобы избежать массивных объединений, возвращающих избыточные данные.
AsNoTracking
может значительно ускорить процесс, если вы не собираетесь редактировать сущности и сохранять их заново.источник
Я также должен был использовать несколько включений, и на 3-м уровне мне нужно было несколько свойств
Это может кому-то помочь :)
источник
.Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt......
Позвольте мне четко заявить, что вы можете использовать строковую перегрузку для включения вложенных уровней независимо от кратности соответствующих отношений, если вы не возражаете против использования строковых литералов:
источник
query.SelectMany(x=>x.foos).Include("bar").Include("bar.docs")...