簡體   English   中英

網絡核心:實體框架然后包含在Projection Select中

[英]Net Core: Entity Framework ThenInclude with Projection Select

我正在嘗試使用實體框架中的Select Projection進行ThenInclude。

我們有三個表,ProductType聯接到ProductTypeDepartmentBridge,然后聯接到Departments表。

由於某些原因,在投影選擇中,我不能僅從Department中選擇列。 Intellisense提供了一個錯誤,並且它不會顯示。 但是,我至少可以看到然后包含在Department表中。

        var departmentsByProductType = unitOfWork.DBSet<Productype>()
            .Include(d => ProductTypeDepartmentBridge)
            .ThenInclude(d => d.Department)
            .Where(d => d.ProductTypeId == 5)
            .Select(d => new 
            {
                DepartmentId = d.DepartmentId,
                DepartmentName = d.DepartmentName
            });

錯誤:

                DepartmentId = d.DepartmentId,
                DepartmentName = d.DepartmentName

注意:由於Bridge表具有多對多關系,因此ProductType可以返回多個Department。

使用Include / ThenInclude不會更改Linq表達式的范圍。 因此,如果要從ProductType構建查詢,並先Include橋接表,然后再包含Department表,則Select的表達式仍為ProductType,它不會移至Department。

如果要查詢具有特定產品類型的部門,並且該部門與橋接表之間存在多對多關系,則:

如果部門包含橋接實體的集合以獲取其產品類型:

var departmentsByProductType = unitOfWork.DbSet<Department>()
    .Where(d => d.ProductTypeDepartmentBridge.Any(b => b.ProductType.ProductTypeId == 5))
    .Select(d => new 
    {
        DepartmentId = d.DepartmentId,
        DepartmentName = d.DepartmentName
    });

如果橋接表將其PK映射為ProductTypeId + DepartmentId的復合鍵,或者將FK映射到實體中,則可以稍微簡化一下...您可以將Where子句簡化為:

.Where(d => d.ProductTypeDepartmentBridge.Any(b => b.ProductTypeId == 5))

如果沒有從部門到橋梁的鏈接:

// This should work....
var departmentsByProductType = unitOfWork.DBSet<Productype>()
            .Where(p => p.ProductTypeId == 5)
            .SelectMany(p => p.ProductTypeDepartmentBridge.Department
                .Select( d => new 
                {
                    DepartmentId = d.DepartmentId,
                    DepartmentName = d.DepartmentName
                }));
// but if not, this will work...
var departmentsByProductType = unitOfWork.DBSet<Productype>()
            .Where(p => p.ProductTypeId == 5)
            .SelectMany(p => p.ProductTypeDepartmentBridge
                .Select( b => new 
                {
                    DepartmentId = b.Department.DepartmentId,
                    DepartmentName = b.Department.DepartmentName
                }));

在第一個示例中,我們遍歷Departments,並通過橋接表中的Any支票,僅提取那些具有所需產品類型鏈接的部門。 返回的唯一部門是包含該產品類型鏈接的部門。

在第二個示例中,我們轉到“產品類型”,然后使用SelectMany表示我們要從一個集合中獲取多個結果。 這將通過橋接實體為我們每個相關部門提供一行。 從那里,我們使用Select獲取部門詳細信息。 有2種類型,因為我不確定100%是否可以直接通過SelectMany到達Department,您可能需要在橋接實體上Select SelectMany ,然后在.Department上Select以獲得部門。 為了防萬一,我提供了兩種變體。 嘗試第一個,如果不起作用,請使用第二個。

使用Select的優點是,除非選擇整個實體並且想要將相關實體作為該返回的實體圖的一部分包含在內,否則不需要使用Include 從實體或什至相關實體中選擇字段時,不需要包括它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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