O método Include () funciona muito bem para listas de objetos. Mas e se eu precisar subir dois níveis? Por exemplo, o método abaixo retornará ApplicationServers com as propriedades incluídas mostradas aqui. No entanto, ApplicationsWithOverrideGroup é outro contêiner que contém outros objetos complexos. Posso fazer um Include () nessa propriedade também? Ou como posso obter essa propriedade para carregar totalmente?
Como está agora, este método:
public IEnumerable<ApplicationServer> GetAll()
{
return this.Database.ApplicationServers
.Include(x => x.ApplicationsWithOverrideGroup)
.Include(x => x.ApplicationWithGroupToForceInstallList)
.Include(x => x.CustomVariableGroups)
.ToList();
}
Preenche apenas a propriedade Enabled (abaixo) e não as propriedades Application ou CustomVariableGroup (abaixo). Como faço isso acontecer?
public class ApplicationWithOverrideVariableGroup : EntityBase
{
public bool Enabled { get; set; }
public Application Application { get; set; }
public CustomVariableGroup CustomVariableGroup { get; set; }
}
c#
entity-framework
eager-loading
Bob Horn
fonte
fonte
Expression must be a member expression
quando eu tente o seguinte: Para incluir uma coleção e, em seguida, uma coleção um nível abaixo:query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection))
.Respostas:
Para EF 6
Certifique-se de adicionar
using System.Data.Entity;
para obter a versãoInclude
que aceita uma lambda.Para EF Core
Use o novo método
ThenInclude
fonte
Include
para cada propriedade:Db.States.Include(state => state.Cities.Select(city => city.Customers).Include(state => state.Cities.Select(city => city.Vendors)
Se bem entendi, você está perguntando sobre a inclusão de propriedades aninhadas. Se então :
ou
ou
fonte
Include(string path)
versão do método.EF Core: usando "ThenInclude" para carregar vários níveis: por exemplo:
fonte
Fiz uma pequena ajuda para o Entity Framework 6 (estilo .Net Core), para incluir subentidades de uma maneira agradável.
Agora está no NuGet: Install-Package ThenInclude.EF6
O pacote está disponível no GitHub .
fonte
DbSet<One>().Include(x => x.Two.Three.Four.Five.Six)
com o único inconveniente de estar computando um produto cartesiano e potencialmente aumentando a largura de banda.Mais exemplos de EFCore no MSDN mostram que você pode fazer coisas bastante complexas com
Include
eThenInclude
.Este é um bom exemplo de quão complexo você pode ficar (esta é uma afirmação!):
Veja como você pode encadear
Include
mesmo depoisThenInclude
e isso meio que 'redefine' você de volta ao nível da entidade de nível superior (Instrutores).Você pode até repetir a mesma coleção de 'primeiro nível' (CourseAssignments) várias vezes seguidas de
ThenIncludes
comandos separados para acessar diferentes entidades filhas .Observe que sua consulta real deve ser marcada no final da cadeia
Include
ouThenIncludes
. O seguinte NÃO funciona:É altamente recomendável que você configure o log e verifique se suas consultas não estão fora de controle se você incluir mais de uma ou duas coisas. É importante ver como ele realmente funciona - e você notará que cada 'inclusão' separada é normalmente uma nova consulta para evitar junções em massa que retornam dados redundantes.
AsNoTracking
pode acelerar bastante as coisas, se você não pretender realmente editar as entidades e salvar novamente.fonte
Eu também tive que usar várias inclusões e no terceiro nível eu precisava de várias propriedades
Isso pode ajudar alguém :)
fonte
.Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt......
Deixe-me declarar claramente que você pode usar a sobrecarga de string para incluir níveis aninhados, independentemente das multiplicidades dos relacionamentos correspondentes, se você não se importa em usar literais de string:
fonte
query.SelectMany(x=>x.foos).Include("bar").Include("bar.docs")...