La méthode Include () fonctionne assez bien pour les listes d'objets. Mais que se passe-t-il si j'ai besoin d'aller deux niveaux en profondeur? Par exemple, la méthode ci-dessous retournera ApplicationServers avec les propriétés incluses affichées ici. Cependant, ApplicationsWithOverrideGroup est un autre conteneur qui contient d'autres objets complexes. Puis-je également faire un Include () sur cette propriété? Ou comment puis-je charger complètement cette propriété?
En l'état actuel, cette méthode:
public IEnumerable<ApplicationServer> GetAll()
{
return this.Database.ApplicationServers
.Include(x => x.ApplicationsWithOverrideGroup)
.Include(x => x.ApplicationWithGroupToForceInstallList)
.Include(x => x.CustomVariableGroups)
.ToList();
}
Remplira uniquement la propriété Enabled (ci-dessous) et non les propriétés Application ou CustomVariableGroup (ci-dessous). Comment puis-je y arriver?
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
la source
la source
Expression must be a member expression
quand j'essaie ceci: Pour inclure une collection et une collection un niveau plus bas:query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection))
.Réponses:
Pour EF 6
Assurez-vous d'ajouter
using System.Data.Entity;
pour obtenir la version deInclude
cette prise dans un lambda.Pour EF Core
Utilisez la nouvelle méthode
ThenInclude
la source
Include
pour chaque propriété:Db.States.Include(state => state.Cities.Select(city => city.Customers).Include(state => state.Cities.Select(city => city.Vendors)
Si je vous comprends bien, vous demandez l'ajout de propriétés imbriquées. Si c'est le cas :
ou
ou
la source
Include(string path)
version de la méthode.EF Core: Utilisation de "ThenInclude" pour charger plusieurs niveaux: Par exemple:
la source
J'ai fait un petit assistant pour Entity Framework 6 (style .Net Core), pour inclure les sous-entités de manière agréable.
C'est maintenant sur NuGet: Install-Package ThenInclude.EF6
Le package est disponible sur GitHub .
la source
DbSet<One>().Include(x => x.Two.Three.Four.Five.Six)
avec le seul inconvénient étant que vous calculez un produit cartésien et augmentez potentiellement la bande passante.Plus d' exemples EFCore sur MSDN montrent que vous pouvez faire des choses assez complexes avec
Include
etThenInclude
.Ceci est un bon exemple de la complexité que vous pouvez obtenir (ce n'est qu'une seule déclaration!):
Voyez comment vous pouvez enchaîner
Include
même aprèsThenInclude
et cela vous ramène au niveau de l'entité de niveau supérieur (instructeurs).Vous pouvez même répéter plusieurs fois la même collection de «premier niveau» (CourseAssignments) suivie de
ThenIncludes
commandes distinctes pour accéder à différentes entités enfants.Notez que votre requête réelle doit être balisée à la fin de la chaîne
Include
ouThenIncludes
. Ce qui suit ne fonctionne PAS:Je vous recommande fortement de configurer la journalisation et de vous assurer que vos requêtes ne sont pas hors de contrôle si vous incluez plus d'une ou deux choses. Il est important de voir comment cela fonctionne réellement - et vous remarquerez que chaque «inclusion» distincte est généralement une nouvelle requête pour éviter que des jointures massives ne renvoient des données redondantes.
AsNoTracking
peut accélérer considérablement les choses si vous n'avez pas l'intention de modifier réellement les entités et de les réenregistrer.la source
J'ai également dû utiliser plusieurs inclusions et au 3ème niveau, j'avais besoin de plusieurs propriétés
Cela peut aider quelqu'un :)
la source
.Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt......
Permettez-moi de dire clairement que vous pouvez utiliser la surcharge de chaîne pour inclure des niveaux imbriqués indépendamment des multiplicités des relations correspondantes, si cela ne vous dérange pas d'utiliser des littéraux de chaîne:
la source
query.SelectMany(x=>x.foos).Include("bar").Include("bar.docs")...