首頁 >後端開發 >C++ >如何在 Entity Framework Core 中預先載入深度嵌套實體?

如何在 Entity Framework Core 中預先載入深度嵌套實體?

Patricia Arquette
Patricia Arquette原創
2024-12-28 03:10:10693瀏覽

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

在Entity Framework Core 中預先載入深度巢狀實體

背景

在Entity Framework Core (EF Core) 中預先載入是一種預載技術與主要實體一起取得相關實體,以避免多次資料庫查詢。但是,在某些情況下,您在嘗試急切地載入深層嵌套實體時可能會遇到限制。

問題

考慮以下場景:

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

當您嘗試時要使用Include(nameof(Customer)).ThenInclude(nameof(Address)) 載入訂單,您可能會注意到Customer 實體的Address 屬性為null。出現這種情況是因為 EF Core 預設不支援急切地載入所有巢狀相關實體。

建議的解決方案

不幸的是,目前官方不支援急切載入 EF Core 中的所有深度嵌套實體。但是,您可以使用兩種自訂擴充方法來實現此目的:

包含擴充功能:

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 擴充:

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

使用範例

在您的通用中儲存庫中,您可以修改GetAllAsync 方法,如下所示:

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

透過使用這些擴充方法,您可以急切地載入指定類型的所有嵌套相關實體。

以上是如何在 Entity Framework Core 中預先載入深度嵌套實體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn