LINQ和子查询

时间:2011-04-13 13:24:55

标签: linq

如何在LINQ中执行以下操作?

select fkUniqueID
from tblUserRights
where fkUniqueID =
(select PkUserID
from Users
where UserID = 'mike')

2 个答案:

答案 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,如果结果中没有元素,则抛出错误。