LINQ查询返回匹配所有子查询条件的所有记录

时间:2012-05-04 16:51:16

标签: linq entity-framework

这可能非常简单,我患有“firday afternoon综合症”但我在构建linq表达时遇到了一些麻烦。

我有以下实体 - Rooms,RoomsPeople和PersonType。

我想回到所有包含老师和学生(人的类型)的房间

所以我的查询是按照

的方式进行的
context.Rooms.Where(x => x.RoomsPeople.Any(b => (((b.PersonTypeID== 1) && (b.PersonTypeID== 2)) && (b.PersonTypeID== 3)))).ToList<Rooms>();

从字面上看,它看起来应该做我想要的......“返回RoomsPeople包含任何personTypes的房间”

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

这应该做你想要的:

context.Rooms
    .Where(x => 
        x.RoomsPeople.Any(b => b.PersonTypeID == 1) &&
        x.RoomsPeople.Any(b => b.PersonTypeID == 2) &&
        x.RoomsPeople.Any(b => b.PersonTypeID == 3)
    )
    .ToList<Rooms>();

如果你查看原始代码,你会发现你有这个谓词:

(((b.PersonTypeID== 1) && (b.PersonTypeID== 2)) && (b.PersonTypeID== 3)))

首先,这可以简化为:

b.PersonTypeID == 1 && b.PersonTypeID == 2 && b.PersonTypeID == 3

现在应该清楚为什么你的代码不起作用了。单个PersonTypeID不可能同时存在多个不同的值(1,2, 3)

因此,解决方案是多次使用.Any谓词 - 对于您要检查的每个人类型一次。