簡體   English   中英

實體框架 - 通用預加載(包括字符串)缺失級別

[英]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,您可能需要解析以執行IncludeThenInclude以及潛在的進一步級別的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM