如何在LINQ中执行以下操作?
select fkUniqueID
from tblUserRights
where fkUniqueID =
(select PkUserID
from Users
where UserID = 'mike')
答案 0 :(得分:1)
我假设你正在使用LINQ to SQL或类似的东西。
理想情况下,使用加入:
var query = from user in db.Users
where user.UserID == "mike"
join userRight in db.UserRights
on user.PkUiserID equals userRight.FkUniqueID
select userRight;
或者,如果你真的想使用子查询:
var mikeIDs = from user in db.Users
where user.UserID == "mike"
select user.PkUserID;
var query = from userRight in db.UserRights
where mikeIDs.Contains(userRight.fkUniqueID)
select userRight;
(注意LINQ是懒惰的,所以这实际上不会为第一部分执行SQL查询。)
当然,如果你已经建立了自己的关系,你可以使用:
var rights = db.Users.Single(u => u.UserID == "mike").UserRights;
...如果没有这样的用户,那将会爆炸,并且它可能进行两次数据库查询。
答案 1 :(得分:0)
这个伪LINQ的东西应该有用(它实际上是问题的翻译)
var uniqueIDs = from userRight in tblUserRights
where fkUniqueID = (from user in Users
where user.UserID = 'mike'
select user.pkUserID).First()
select userRight.fkUniqueID
在SQL中,我们不必使用First()
构造之类的任何东西(Top 1
将是SQL等价物),因为如果只有一条记录,SQL将尝试与我们合作,正常工作(或根本没有记录),如果有两个或更多记录,则抛出描述性错误。
在C#中,这将转换为编译时错误,因为我们正在与T
进行比较,并且查询返回IEnumerable<T>
。
First()
显式返回集合中的第一个T,如果结果中没有元素,则抛出错误。