[英]Entity Framework - generic eager loading (include string) missing levels
我的數據庫包含 Vendor、Project、Address 和 Vendor_Project 表。 每個供應商都有一個地址。 我寫了一個通用的 function 執行包含從輸入接收到的級別。
string[] includes = {"Vendor","Project"};
IEnumerable<Vendor_Project> vendorsOfProject = (IEnumerable<Vendor_Project>) await DataStore.Instance.vendorProjectsService.GetAll(includes);
public async Task<IEnumerable<T>> GetAll(string[] includes = null)
{
using (DeployToolDBContex contex = _contexFactory.CreateDbContext())
{
var query = contex.Set<T>().AsQueryable();
foreach (var include in includes)
query = query.Include(include);
return query.ToList();
}
}
在上面的示例中,我得到了請求的結果,但地址是 null。我如何才能使該查詢適用於所有級別及其子級別?
對於 EF6,您需要將每個孩子和孫子指定為包含列表的一部分,因此{"child", "child.grandchild"}
。 對於 EF Core,您可能需要解析以執行Include
和ThenInclude
以及潛在的進一步級別的ThenInclude
鏈接。
我強烈建議您重新考慮您認為需要包含在 GetAll 方法之類的東西上的方法。 相反,考慮利用 Projection 將實體圖向下轉換為包含實體和相關實體詳細信息的 ViewModel。 像這樣的特別通用模式的問題在於,您正在致力於將數據庫的很大一部分具體化為 memory。在獲取實體列表時,您通常不需要每個相關實體的每個字段,而是一些重要的字段/鍵,以及可能來自相關實體的一些摘要詳細信息或計數等。
當獲取單個頂級實體及其相關實體的分類時,您通常可能仍然需要急切加載相關實體,例如呈現詳細視圖。 對於 EF Core,當你確實有一個合法的案例來急切加載大量實體,如嵌套子 collections,你應該利用拆分查詢,以便 EF 將對數據庫執行多個查詢,而不是試圖在一個查詢中連接所有相關表。 不同之處在於,對於默認的急切加載 JOIN 實現,您有 1 個具有 15 列的頂級實體和 10 個具有 10 列的相關子實體,每個子實體最多有 2 個具有 8 列的大子實體,您生成一個笛卡爾積以拉回所有跨所有組合行的組合列,然后 EF 迭代這些列以構建實體圖。 使用拆分查詢,您仍然會拉回所有行,但使用單獨的查詢,因此總體上發送的數據較少。
您應該避免使用預先加載來加載數據集的主要原因,尤其是像“全部獲取”這樣的事情是在傳輸和具體化所有這些實體之后,默認情況下 EF DbContext 將跟蹤這些實體中的每一個,這意味着所有進一步的查詢這樣,DbContext 將涉及比較和檢查本地跟蹤的實體,從而減慢未來的查詢速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.