网络核心:实体框架然后包含在Projection Select中

用户11973685

我正在尝试在实体框架中使用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
                }));

在第一个示例中,我们遍历部门,并Any通过桥接表中支票,只选择那些与所需产品类型有链接的部门返回的唯一部门是包含该产品类型链接的部门。

在第二个示例中,我们转到“产品类型”,但是通常SelectMany说我们想从一个集合中获取多个结果。这将通过桥接实体为我们每个相关部门提供一行。从那里我们Select可以获取部门详细信息。有2种类型,因为我不是100%确定您可以SelectMany直接通过Department进入部门,您可能需要SelectMany在桥接实体上,然后Select在.Department上获取部门。为了防万一,我提供了两个变体。尝试第一个,如果不起作用,请使用第二个。

使用的优点Select是,Include除非您选择整个实体并希望将相关实体作为该返回的实体图的一部分包含在内,否则无需使用从实体或什至相关实体中选择字段时,不需要包括它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章