我正在尝试在实体框架中使用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] 删除。
我来说两句