使用具有OR子句的Linq 2实体中的Where方法

时间:2011-01-04 12:37:24

标签: linq-to-entities

我想在Linq 2实体中使用Where方法,它将等于此

userRepository.Users.Where(u=>u.RoleID == 1 || u=>u.RoldID == 2).Select(o => new SelectListItem { Text = o.Role.RoleName, Value = o.RoleID.ToString() }).ToList();

问题当然是其中(u => u.RoleID == 1 || u => u.RoldID == 2)

问题是我不知道如何在WHERE子句中使用带有OR的WHERE方法。

任何想法(上面的代码都不会编译lambda表达式的过程b / c。

userRepository.Users返回用户实体列表。

我想这可以使用.Where()的连接来完成。哪里()但是我需要一个OR。

2 个答案:

答案 0 :(得分:3)

只需删除额外的u =>

Where(u => u.RoleID == 1 || u.RoleID == 2).

在你的代码中,你试图“或”lambdas,“lambda1或lambda2”,这是不可能的,因为你已经注意到了。 但是你可以“或”lambda中的表达式:

lambda(expression1 OR expression2)

将代码读作:

(用户用户) {    return user.RoleId == 1 || user.RoleId == 2; }

如果这让事情更清楚......

另外,我猜你最后一部分是“u.RoldId == 2”,而不是RoleId。

答案 1 :(得分:1)

使用通用匿名委托,在本例中为Func。

这意味着:“给定用户返回布尔值”,或“给定用户,提供标准以确定是否应该选择该用户”。

使用lambda表达式,您只需要将变量定义为“给定”一次。

基本语法是

variableName => expression

在这种情况下我们有

u => (expression)

其中u是User,(expression)是一个计算结果为布尔值的表达式。

Where(u => (u.RoleID==1 || u.RoleID==2))

(正如Roger在完成这篇文章时指出的那样是正确答案)

执行AND或任何其他逻辑比较将完全相同

Where(u=> u.Name.Equals(userName) && u.Email.Equals(email))

你可以有任何表达式,唯一的要求是它返回一个布尔值。即使忽略你给出的变量的表达式也没问题。

Where(u=> true)

这将选择所有用户,而可能毫无意义,它演示了lambda表达式的结构。

编辑:没有看到Roger的编辑所提供的其他信息,这可能比我更好地解释了这一点,直到我发了这篇文章,对不起重复。