LINQ.NET无法在.include .select .where上筛选,以便在深度嵌套的对象上筛选集合

drnojrws  于 2023-01-27  发布在  .NET
关注(0)|答案(2)|浏览(128)

我在使用以下代码过滤具有深度嵌套对象的返回集合时遇到了麻烦

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语句上执行此操作。
提前感谢您的帮助。

uxhixvfz

uxhixvfz1#

您可以尝试使用LINQ的**Any**吗?
来自Microsoft文档:
确定序列中的任何元素是否存在或满足某个条件。
在您的示例中,它应该是这样的:

.Where(w => w.id1 = _id && w.isActive = t &&
w.Table2.where(s => s.SubTable1.Users.Departments.Any(x => x.DeptId != 1))
yebdmbv4

yebdmbv42#

  • (下面我假设您的问题包含伪代码,并相应地回答,因为您的代码通常不会编译。我还假设您使用的是EF Core。)*

理论上可以在Include语句中这样做:

var my collection = await myRepository.GetDBSet<MyObjectType>()
                    .Include(...)
                    ...
                    .Include(x => x.Table2)
                        .ThenInclude(y => y.SubTable1)
                        .ThenInclude(z => z.Users)
                        .ThenInclude(t => t.Departments.Where(d => d.Id == 1))
                    ...
                    .Where(w => w.id1 = _id && w.isActive = t);

根据我的经验,EF Core中对此类语法的支持有点不足--例如,每个LINQ查询只允许一个此类条件--但这仍然是过滤掉不需要的相关记录 * 并 * 从数据库中选择原始的、跟踪的实体的最简单方法。
此功能称为过滤包含,从EF Core 5.0开始可用(文档)

相关问题