我想在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。
答案 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的编辑所提供的其他信息,这可能比我更好地解释了这一点,直到我发了这篇文章,对不起重复。