猿问

如何在LINQ中执行子查询?

这是我尝试转换为LINQ的查询的示例:


SELECT *

FROM Users

WHERE Users.lastname LIKE '%fra%'

    AND Users.Id IN (

         SELECT UserId 

         FROM CompanyRolesToUsers 

         WHERE CompanyRoleId in (2,3,4) )

CompanyRolesToUsers和之间存在FK关系Users,但它是多对多关系,并且CompanyRolesToUsers是联结表。


我们已经构建了大部分站点,并且已经通过使用PredicateExtensions类构建Expressions来完成了大部分过滤工作。


简单过滤器的代码如下所示:


 if (!string.IsNullOrEmpty(TextBoxLastName.Text))

 {

     predicateAnd = predicateAnd.And(c => c.LastName.Contains(

                                     TextBoxLastName.Text.Trim()));

 }


e.Result = context.Users.Where(predicateAnd);

我正在尝试为另一个表中的子选择添加谓词。(CompanyRolesToUsers)


我想要添加的是执行以下操作的操作:


int[] selectedRoles = GetSelectedRoles();

if( selectedRoles.Length > 0 )

{

    //somehow only select the userid from here ???:

    var subquery = from u in CompanyRolesToUsers

                   where u.RoleID in selectedRoles

                   select u.UserId;


    //somehow transform this into an Expression ???:

    var subExpression = Expression.Invoke(subquery);


    //and add it on to the existing expressions ???:

    predicateAnd = predicateAnd.And(subExpression);

}

有什么办法吗?这很令人沮丧,因为我可以轻松地编写存储过程,但是我对LINQ并不陌生,而且我有一个截止日期。我找不到匹配的示例,但我确定它在某个地方。


慕标5832272
浏览 1113回答 3
3回答

收到一只叮咚

该语句不需要子查询,最好写成select u.* from Users u, CompanyRolesToUsers cwhere u.Id = c.UserId        --join just specified here, perfectly fineand u.lastname like '%fra%'and c.CompanyRoleId in (2,3,4)要么select u.* from Users u inner join CompanyRolesToUsers c             on u.Id = c.UserId    --explicit "join" statement, no diff from above, just preferencewhere u.lastname like '%fra%'  and c.CompanyRoleId in (2,3,4)话虽这么说,在LINQ中from u in Usersfrom c in CompanyRolesToUsers where u.Id == c.UserId &&      u.LastName.Contains("fra") &&      selectedRoles.Contains(c.CompanyRoleId)select u要么from u in Usersjoin c in CompanyRolesToUsers        on u.Id equals c.UserIdwhere u.LastName.Contains("fra") &&      selectedRoles.Contains(c.CompanyRoleId)select u同样,这两种方式都是代表这一点的可敬方式。我本人在这两种情况下都希望使用显式的“ join”语法,但是它有...

浮云间

这就是我在LINQ中进行子查询的方式,我认为这应该得到您想要的。您可以使用另一个子查询替换显式的CompanyRoleId == 2 ...来替换您想要的不同角色,或者也可以将其加入。from u in Usersjoin c in (    from crt in CompanyRolesToUsers    where CompanyRoleId == 2    || CompanyRoleId == 3    || CompanyRoleId == 4) on u.UserId equals c.UserIdwhere u.lastname.Contains("fra")select u;
随时随地看视频慕课网APP
我要回答