在 T-SQL 中,您可以进行如下查询:
SELECT * FROM Users WHERE User_Rights IN ("Admin", "User", "Limited")
您将如何在 LINQ to Entities 查询中复制它?甚至可能吗?
你需要从你思考它的方式来改变它。不是在预定义的一组适用用户权限中查找当前项目的用户权限,而是询问一组预定义的用户权限是否包含当前项目的适用值。这与在 .NET 的常规列表中查找项目的方式完全相同。
使用 LINQ 有两种方法,一种使用查询语法,另一种使用方法语法。本质上,它们是相同的,可以根据您的喜好互换使用:
查询语法:
var selected = from u in users where new[] { "Admin", "User", "Limited" }.Contains(u.User_Rights) select u foreach(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,而不是分配变量:
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; }