Linq to Entities - SQL“IN”子句在T-SQL中,您可以进行如下查询:SELECT * FROM Users WHERE User_Rights IN ("Admin", "User", "Limited")您如何在LINQ to Entities查询中复制它?它甚至可能吗?
3 回答
翻阅古今
TA贡献1780条经验 获得超5个赞
你需要根据你的想法来改变它。如果它包含当前项目的适用值,您将询问一组预定义的用户权限,而不是“在”中查找当前项目在预定义的一组适用用户权限中的用户权限。这与在.NET中的常规列表中找到项目的方式完全相同。
使用LINQ有两种方法,一种使用查询语法,另一种使用方法语法。基本上,它们是相同的,可以根据您的偏好互换使用:
查询语法:
var selected = from u in users where new[] { "Admin", "User", "Limited" }.Contains(u.User_Rights) select uforeach(user u in selected){ //Do your stuff on each selected user;}
方法语法:
var selected = users.Where(u => new[] { "Admin", "User", "Limited" }.Contains(u.User_Rights));foreach(user u in selected){ //Do stuff on each selected user;}
我在这个实例中的个人偏好可能是方法语法,因为我可以通过这样的匿名调用来代替分配变量:
foreach(User u in users.Where(u => new [] { "Admin", "User", "Limited" }.Contains(u.User_Rights))){ //Do stuff on each selected user;}
从语法上看,这看起来更复杂,你必须理解lambda表达式或委托的概念才能真正弄清楚发生了什么,但正如你所看到的,这会使代码压缩很多。
这一切都取决于你的编码风格和偏好 - 我的三个例子都做了同样的事情。
另一种方法甚至不使用LINQ,您可以使用相同的方法语法将“where”替换为“FindAll”并获得相同的结果,这也将在.NET 2.0中起作用:
foreach(User u in users.FindAll(u => new [] { "Admin", "User", "Limited" }.Contains(u.User_Rights))){ //Do stuff on each selected user;}
SMILET
TA贡献1796条经验 获得超4个赞
在这种情况下,我会选择Inner Join。如果我会使用contains,它会迭代6次,尽管事实上只有一个匹配。
var desiredNames = new[] { "Pankaj", "Garg" }; var people = new[] { new { FirstName="Pankaj", Surname="Garg" }, new { FirstName="Marc", Surname="Gravell" }, new { FirstName="Jeff", Surname="Atwood" } }; var records = (from p in people join filtered in desiredNames on p.FirstName equals filtered select p.FirstName).ToList();
包含的缺点
假设我有两个列表对象。
List 1 List 2 1 12 2 7 3 8 4 98 5 9 6 10 7 6
使用Contains,它将搜索List 2中的每个List 1项,这意味着迭代将发生49次!
- 3 回答
- 0 关注
- 472 浏览
添加回答
举报
0/150
提交
取消