在T-SQL中,可以有如下查询:
SELECT * FROM Users WHERE User_Rights IN ("Admin", "User", "Limited")
在LINQ到实体查询中,您将如何复制这一点?有可能吗?
在T-SQL中,可以有如下查询:
SELECT * FROM Users WHERE User_Rights IN ("Admin", "User", "Limited")
在LINQ到实体查询中,您将如何复制这一点?有可能吗?
你需要改变你对它的看法.不是通过"in"在预定义的适用用户权限集中查找当前项的用户权限,而是询问预定义的用户权限集是否包含当前项的适用值.这与在中的常规列表中查找项目的方式完全相同.网
使用LINQ有两种方法,一种使用查询语法,另一种使用方法语法.基本上,它们是相同的,可以根据您的喜好互换使用:
Query Syntax:
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;
}
Method Syntax:
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;
}