在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中文網其他相關文章!