Die Include () -Methode eignet sich sehr gut für Listen für Objekte. Aber was ist, wenn ich zwei Ebenen tief gehen muss? Die folgende Methode gibt beispielsweise ApplicationServer mit den hier gezeigten enthaltenen Eigenschaften zurück. ApplicationsWithOverrideGroup ist jedoch ein weiterer Container, der andere komplexe Objekte enthält. Kann ich auch ein Include () für diese Eigenschaft ausführen? Oder wie kann ich diese Eigenschaft vollständig laden?
So wie es jetzt aussieht, ist diese Methode:
public IEnumerable<ApplicationServer> GetAll()
{
return this.Database.ApplicationServers
.Include(x => x.ApplicationsWithOverrideGroup)
.Include(x => x.ApplicationWithGroupToForceInstallList)
.Include(x => x.CustomVariableGroups)
.ToList();
}
Füllt nur die Enabled-Eigenschaft (unten) und nicht die Application- oder CustomVariableGroup-Eigenschaften (unten). Wie mache ich das möglich?
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
quelle
quelle
Expression must be a member expression
wenn ich Folgendes versuche: So schließen Sie eine Sammlung und dann eine Sammlung eine Ebene tiefer ein :query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection))
.Antworten:
Für EF 6
Stellen Sie sicher, dass Sie hinzufügen
using System.Data.Entity;
, um die Version zu erhaltenInclude
, die ein Lambda enthält.Für EF Core
Verwenden Sie die neue Methode
ThenInclude
quelle
Include
für jede Eigenschaft anrufen :Db.States.Include(state => state.Cities.Select(city => city.Customers).Include(state => state.Cities.Select(city => city.Vendors)
Wenn ich Sie richtig verstehe, fragen Sie nach verschachtelten Eigenschaften. Wenn ja :
oder
oder
quelle
Include(string path)
Version der Methode.EF Core: Verwenden von "ThenInclude" zum Laden mehrerer Ebenen: Zum Beispiel:
quelle
Ich habe einen kleinen Helfer für Entity Framework 6 (.Net Core-Stil) erstellt, um Unterentitäten auf nette Weise einzuschließen.
Es ist jetzt auf NuGet: Install-Package ThenInclude.EF6
Das Paket ist auf GitHub verfügbar .
quelle
DbSet<One>().Include(x => x.Two.Three.Four.Five.Six)
mit dem einzigen Nachteil verketten können, dass Sie ein kartesisches Produkt berechnen und möglicherweise die Bandbreite erhöhen.Weitere EFCore-Beispiele auf MSDN zeigen, dass Sie mit
Include
und einige recht komplexe Dinge tun könnenThenInclude
.Dies ist ein gutes Beispiel dafür, wie komplex Sie werden können (dies ist alles eine Aussage!):
Sehen Sie, wie Sie
Include
auch danachThenInclude
verketten können, und es setzt Sie auf die Ebene der Entität der obersten Ebene (Instruktoren) zurück.Sie können dieselbe Sammlung der ersten Ebene (CourseAssignments) sogar mehrmals wiederholen, gefolgt von separaten
ThenIncludes
Befehlen, um zu verschiedenen untergeordneten Entitäten zu gelangen.Beachten Sie, dass Ihre eigentliche Abfrage am Ende der Kette
Include
oder markiert sein mussThenIncludes
. Folgendes funktioniert NICHT:Ich würde Ihnen dringend empfehlen, die Protokollierung einzurichten und sicherzustellen, dass Ihre Abfragen nicht außer Kontrolle geraten, wenn Sie mehr als ein oder zwei Dinge einbeziehen. Es ist wichtig zu sehen, wie es tatsächlich funktioniert - und Sie werden feststellen, dass jedes einzelne "Include" normalerweise eine neue Abfrage ist, um zu vermeiden, dass massive Joins redundante Daten zurückgeben.
AsNoTracking
Dies kann die Arbeit erheblich beschleunigen, wenn Sie nicht beabsichtigen, die Entitäten tatsächlich zu bearbeiten und erneut zu speichern.quelle
Ich musste auch mehrere Includes verwenden und auf der 3. Ebene brauchte ich mehrere Eigenschaften
Das kann jemandem helfen :)
quelle
.Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt......
Lassen Sie mich klarstellen, dass Sie die Zeichenfolgenüberladung verwenden können, um verschachtelte Ebenen unabhängig von der Vielzahl der entsprechenden Beziehungen einzuschließen, wenn Sie nichts dagegen haben, Zeichenfolgenliterale zu verwenden:
quelle
query.SelectMany(x=>x.foos).Include("bar").Include("bar.docs")...