525 Stimmen

Entity Framework - Mehrere Ebenen von Eigenschaften einbeziehen

Die Include()-Methode funktioniert recht gut für Listen auf Objekten. Was aber, wenn ich zwei Ebenen tiefer gehen muss? Die nachstehende Methode gibt zum Beispiel ApplicationServers mit den hier gezeigten eingeschlossenen Eigenschaften zurück. ApplicationsWithOverrideGroup ist jedoch ein weiterer Container, der andere komplexe Objekte enthält. Kann ich eine Include()-Methode auch für diese Eigenschaft anwenden? Oder wie kann ich erreichen, dass diese Eigenschaft vollständig geladen wird?

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 Eigenschaft Aktiviert (unten) und nicht die Eigenschaften Anwendung oder CustomVariableGroup (unten). Wie kann ich dies erreichen?

public class ApplicationWithOverrideVariableGroup : EntityBase
{
    public bool Enabled { get; set; }
    public Application Application { get; set; }
    public CustomVariableGroup CustomVariableGroup { get; set; }
}

977voto

Diego Punkte 18573

Für EF 6

using System.Data.Entity;

query.Include(x => x.Collection.Select(y => y.Property))

Stellen Sie sicher, dass Sie Folgendes hinzufügen using System.Data.Entity; um die Version von Include die ein Lambda aufnimmt.


Für EF Core

Verwenden Sie die neue Methode ThenInclude

using Microsoft.EntityFrameworkCore;

query.Include(x => x.Collection)
     .ThenInclude(x => x.Property);

99voto

Judo Punkte 5059

Wenn ich Sie richtig verstehe, fragen Sie nach der Einbeziehung verschachtelter Eigenschaften. Wenn ja :

.Include(x => x.ApplicationsWithOverrideGroup.NestedProp)

ou

.Include("ApplicationsWithOverrideGroup.NestedProp")  

ou

.Include($"{nameof(ApplicationsWithOverrideGroup)}.{nameof(NestedProp)}")

86voto

thangcao Punkte 1671

EF-Kern: Verwendung von "ThenInclude" zum Laden mehrerer Ebenen: Zum Beispiel:

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
        .ThenInclude(author => author.Photo)
    .ToList();

62voto

Simon_Weaver Punkte 129442

En EFCore-Beispiele auf MSDN zeigen, dass man einige recht komplexe Dinge mit Include y ThenInclude .

Dies ist ein gutes Beispiel dafür, wie komplex man werden kann (dies ist eine einzige verkettete Anweisung!):

viewModel.Instructors = await _context.Instructors

      .Include(i => i.OfficeAssignment)

      .Include(i => i.CourseAssignments)
        .ThenInclude(i => i.Course)
            .ThenInclude(i => i.Enrollments)
                .ThenInclude(i => i.Student)

      .Include(i => i.CourseAssignments)
        .ThenInclude(i => i.Course)
            .ThenInclude(i => i.Department)

      .AsNoTracking()
      .OrderBy(i => i.LastName)
      .ToListAsync();

Sie können mehrere Include Anrufe - auch nach ThenInclude und man wird sozusagen auf die Ebene der obersten Instanz (Ausbilder) "zurückgesetzt".

Sie können sogar die gleiche Sammlung der ersten Ebene (CourseAssignments) mehrmals wiederholen, gefolgt von separaten ThenIncludes Befehle, um zu verschiedenen untergeordneten Entitäten zu gelangen.

Beachten Sie, dass Ihre eigentliche Abfrage an das Ende der Include o ThenIncludes Kette. Das Folgende funktioniert NICHT:

var query = _context.Instructors.AsQueryable();
query.Include(i => i.OfficeAssignment);

var first10Instructors = query.Take(10).ToArray();

Ich würde Ihnen dringend empfehlen, eine Protokollierung einzurichten und dafür zu sorgen, dass Ihre Abfragen nicht außer Kontrolle geraten, wenn Sie mehr als ein oder zwei Dinge eingeben. Es ist wichtig zu sehen, wie es tatsächlich funktioniert - und Sie werden feststellen, dass jedes separate "Include" in der Regel eine neue Abfrage ist, um zu vermeiden, dass massive Verknüpfungen redundante Daten zurückgeben.

AsNoTracking kann die Dinge erheblich beschleunigen, wenn Sie nicht vorhaben, die Entitäten zu bearbeiten und erneut zu speichern.


EFCore 5 hat einige Änderungen an der Art und Weise vorgenommen, wie Abfragen für mehrere Gruppen von Entitäten an den Server gesendet werden. Es gibt neue Optionen für geteilte Abfragen die bestimmte Abfragen dieser Art mit weniger Joins wesentlich effizienter machen können, aber stellen Sie sicher, dass Sie die Einschränkungen kennen - und aktivieren Sie die Protokollierung, um spätere Leistungsüberraschungen zu vermeiden.

34voto

Lenny32 Punkte 614

Ich habe einen kleinen Helfer für Entity Framework 6 (.Net Core Stil) gemacht, um Sub-Entitäten auf eine nette Art und Weise einzubinden.

Es ist jetzt auf NuGet: Install-Package ThenInclude.EF6

using System.Data.Entity;

var thenInclude = context.One.Include(x => x.Twoes)
    .ThenInclude(x=> x.Threes)
    .ThenInclude(x=> x.Fours)
    .ThenInclude(x=> x.Fives)
    .ThenInclude(x => x.Sixes)
    .Include(x=> x.Other)
    .ToList();

Das Paket ist verfügbar auf GitHub .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X