linq子查询语法解释

时间:2016-03-21 02:02:46

标签: c# asp.net-mvc linq

我试图在我的代码上创建一个子查询,并且能够创建子查询,但我无法理解某些部分。

下面是我遵循的子查询以及我对我理解的内容的评论。

List<int> IdsToFind = new List<int>() {2, 3, 4}; 
db.Users
.Where(u => SqlMethods.Like(u.LastName, "%fra%"))
.Where(u =>
       db.CompanyRolesToUsers // the table inside the subquery
      .Where(crtu => IdsToFind.Contains(crtu.CompanyRoleId)) //the filter inside the subquery
      .Select(crtu =>  crtu.UserId) //I cannot understand why there is a select of column here 
      .Contains(u.Id) //I cannot understand the additional filter here
)

以下是上述LINQ的示例查询

SELECT * FROM Users WHERE Users.lastname LIKE '%fra%'AND Users.Id IN (
     SELECT UserId 
     FROM CompanyRolesToUsers 
     WHERE CompanyRoleId in (2,3,4))

代码来自How to do subquery in linq

PS:我使用了其他人的代码,这样我就可以给出一个简单的问题样本。我的代码很复杂。谢谢。

1 个答案:

答案 0 :(得分:1)

您只需从子查询中挑选ID,因为您只需要这些ID,然后将它们匹配到更大的集合中。

.Select(crtu =>  crtu.UserId)

这会丢弃您不需要的所有额外数据。它与SELECT UserId

完全相同
.Contains(u.Id)

这会将子查询限制为仅搜索列表中的条目。它与原版中的(2,3,4))中的WHERE CompanyRoleId类似。

如果有任何部分需要更多澄清,请告诉我,我可以尝试提供更多帮助。