为了账号安全,请及时绑定邮箱和手机立即绑定

如何在LINQ中执行子查询?

如何在LINQ中执行子查询?

C#
慕标5832272 2019-10-18 10:45:27
这是我尝试转换为LINQ的查询的示例:SELECT *FROM UsersWHERE 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并不陌生,而且我有一个截止日期。我找不到匹配的示例,但我确定它在某个地方。
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

该语句不需要子查询,最好写成


select u.* 

from Users u, CompanyRolesToUsers c

where u.Id = c.UserId        --join just specified here, perfectly fine

and 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 preference

where u.lastname like '%fra%'

  and c.CompanyRoleId in (2,3,4)

话虽这么说,在LINQ中


from u in Users

from c in CompanyRolesToUsers 

where u.Id == c.UserId &&

      u.LastName.Contains("fra") &&

      selectedRoles.Contains(c.CompanyRoleId)

select u

要么


from u in Users

join c in CompanyRolesToUsers 

       on u.Id equals c.UserId

where u.LastName.Contains("fra") &&

      selectedRoles.Contains(c.CompanyRoleId)

select u

同样,这两种方式都是代表这一点的可敬方式。我本人在这两种情况下都希望使用显式的“ join”语法,但是它有...


查看完整回答
反对 回复 2019-10-18
?
浮云间

TA贡献1829条经验 获得超4个赞

这就是我在LINQ中进行子查询的方式,我认为这应该得到您想要的。您可以使用另一个子查询替换显式的CompanyRoleId == 2 ...来替换您想要的不同角色,或者也可以将其加入。


from u in Users

join c in (

    from crt in CompanyRolesToUsers

    where CompanyRoleId == 2

    || CompanyRoleId == 3

    || CompanyRoleId == 4) on u.UserId equals c.UserId

where u.lastname.Contains("fra")

select u;


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 1112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信