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; }
}

28voto

dnxit Punkte 6682

Ich musste auch mehrere Includes verwenden und auf der 3. Ebene brauchte ich mehrere Eigenschaften

(from e in context.JobCategorySet
                      where e.Id == id &&
                            e.AgencyId == agencyId
                      select e)
                      .Include(x => x.JobCategorySkillDetails)
                      .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.DurationType))
                      .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.RuleType))
                      .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.RateType))
                      .FirstOrDefaultAsync();

Vielleicht hilft das jemandem :)

10voto

mrmashal Punkte 871

Lassen Sie mich klar sagen, dass Sie die String-Überladung verwenden können, um verschachtelte Ebenen unabhängig von den Multiplizitäten der entsprechenden Beziehungen einzubeziehen, wenn es Ihnen nichts ausmacht, String-Literale zu verwenden:

query.Include("Collection.Property")

1voto

Darth Scitus Punkte 405

Ich werde meine Lösung für mein spezielles Problem hinzufügen. Ich hatte zwei Sammlungen auf der gleichen Ebene, die ich einbeziehen musste. Die endgültige Lösung sah wie folgt aus.

var recipe = _bartendoContext.Recipes
    .Include(r => r.Ingredients)
    .ThenInclude(r => r.Ingredient)
    .Include(r => r.Ingredients)
    .ThenInclude(r => r.MeasurementQuantity)
    .FirstOrDefault(r => r.Id == recipeId);
if (recipe?.Ingredients == null) return 0m;
var abv = recipe.Ingredients.Sum(ingredient => ingredient.Ingredient.AlcoholByVolume * ingredient.MeasurementQuantity.Quantity);
return abv;

Dies ist die Berechnung des prozentualen Alkoholgehalts eines bestimmten Getränkerezepts. Wie Sie sehen können, habe ich einfach die Zutatenliste zweimal eingegeben und dann die Zutat und die Menge hinzugefügt.

0voto

Ich habe einen einfacheren Weg gefunden. Sie brauchen das Paket ThenInclude.EF nicht zu installieren oder ThenInclude für alle verschachtelten Navigationseigenschaften zu verwenden. Machen Sie es einfach so wie unten gezeigt, EF wird den Rest für Sie erledigen. Beispiel:

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

0voto

Marek Pio Punkte 31

Ich habe eine Indexseite, die MbsNavigation.Name anzeigt, die ein als Fremdschlüssel geladenes Firmware-Objekt ist. Das Firmware-Objekt ist groß, so dass es einige Minuten dauert, die Index-Seite über das Internet zu laden.

BatterySystem = await _context.BatterySystems.Include(b => b.MbsNavigation)

Dies ist eine Lösung, um nur Firmware.Name zu laden:

BatterySystem = await _context.BatterySystems
.Include(b => b.MbsNavigation)
.Select(b => new BatterySystem() 
{
    Name = b.Name,
    MbsNavigation = new Firmware() { Name = b.MbsNavigation.Name },
})
.ToListAsync();

Jetzt wird der Index sofort geladen.

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