我在使用以下代码过滤具有深度嵌套对象的返回集合时遇到了麻烦
var my collection = await myRepository.GetDBSet<MyObjectType>()
.include(x => Table1)
.include(x => Table2)
.include(x => Table2.Select(y => SubTable1))
.include(x => Table2.Select(y => SubTable1.Users))
.include(x => Table2.Select(y => SubTable1.Users.Addressess))
.include(x => Table2.Select(y => SubTable1.Users.Roles))
.include(x => Table2.Select(y => SubTable1.Users.Departments))
.Where(w => w.id1 = _id && w.isActive = t);
此示例查询有效,请忽略. where子句
我想过滤SubTable1.Users.Departments,并且不返回deptId!= 1的任何部门
以下是我在. where部分尝试的内容
.Where(w => w.id1 = _id && w.isActive = t &&
w.Table2.where(s => s.SubTable1.Users.Departments.First().DeptId != 1))
这不起作用,错误是说它不能将int转换为bool。我必须添加. first(),因为它不允许使用deptId。我试图过滤掉任何具有deptId的dept记录,但不确定如何在深度嵌套的linq语句上执行此操作。
提前感谢您的帮助。
2条答案
按热度按时间uxhixvfz1#
您可以尝试使用LINQ的**Any**吗?
来自Microsoft文档:
确定序列中的任何元素是否存在或满足某个条件。
在您的示例中,它应该是这样的:
yebdmbv42#
理论上可以在
Include
语句中这样做:根据我的经验,EF Core中对此类语法的支持有点不足--例如,每个LINQ查询只允许一个此类条件--但这仍然是过滤掉不需要的相关记录 * 并 * 从数据库中选择原始的、跟踪的实体的最简单方法。
此功能称为过滤包含,从EF Core 5.0开始可用(文档)