Heim >Backend-Entwicklung >C++ >Wie lade ich tief verschachtelte Entitäten eifrig in den Entity Framework Core?

Wie lade ich tief verschachtelte Entitäten eifrig in den Entity Framework Core?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-28 03:10:10676Durchsuche

How to Eager Load Deeply Nested Entities in Entity Framework Core?

Eager Loading Deeply Nested Entities in Entity Framework Core

Hintergrund

Eager Loading in Entity Framework Core (EF Core) ist eine Technik für vor- Abrufen verwandter Entitäten zusammen mit der primären Entität, um mehrere Datenbankabfragen zu vermeiden. In bestimmten Szenarien kann es jedoch zu Einschränkungen kommen, wenn Sie versuchen, tief verschachtelte Entitäten per Eager zu laden.

Das Problem

Stellen Sie sich das folgende Szenario vor:

public class Order
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CustomerId { get; set; }
    public Customer Customer { get; set; }
}

public class Customer
{
    public int Id { get; set; } 
    public string Name { get; set; }
    public int AddressId { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string PostCode { get; set; }
    public string City { get; set; }
}

Wenn Sie es versuchen Um eine Bestellung mit Include(nameof(Customer)).ThenInclude(nameof(Address)) zu laden, stellen Sie möglicherweise fest, dass die Address-Eigenschaft der Customer-Entität null ist. Dies liegt daran, dass EF Core standardmäßig kein Eager Loading aller verschachtelten zugehörigen Entitäten unterstützt.

Vorgeschlagene Lösung

Leider gibt es derzeit keine offizielle Unterstützung für Eager Loading aller tief verschachtelten Entitäten in EF Core . Es gibt jedoch zwei benutzerdefinierte Erweiterungsmethoden, die Sie verwenden können, um dies zu erreichen:

Erweiterung einschließen:

public static IQueryable<T> Include<T>(this IQueryable<T> source, IEnumerable<string> navigationPropertyPaths)
    where T : class
{
    return navigationPropertyPaths.Aggregate(source, (query, path) => query.Include(path));
}

GetIncludePaths-Erweiterung:

public static IEnumerable<string> GetIncludePaths(this DbContext context, Type clrEntityType, int maxDepth = int.MaxValue)
{
    ...
}

Verwendungsbeispiel

In Ihrem generischen Repository können Sie GetAllAsync ändern Methode wie folgt:

public virtual async Task<IEnumerable<T>> GetAllAsync(Expression<Func<T, bool>> predicate = null)
{
    var query = Context.Set<T>()
        .Include(Context.GetIncludePaths(typeof(T));
    if (predicate != null)
        query = query.Where(predicate);
    return await query.ToListAsync();
}

Mithilfe dieser Erweiterungsmethoden können Sie problemlos alle verschachtelten zugehörigen Entitäten für den angegebenen Typ laden.

Das obige ist der detaillierte Inhalt vonWie lade ich tief verschachtelte Entitäten eifrig in den Entity Framework Core?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn