我试图在我的代码上创建一个子查询,并且能够创建子查询,但我无法理解某些部分。
下面是我遵循的子查询以及我对我理解的内容的评论。
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:我使用了其他人的代码,这样我就可以给出一个简单的问题样本。我的代码很复杂。谢谢。
答案 0 :(得分:1)
您只需从子查询中挑选ID,因为您只需要这些ID,然后将它们匹配到更大的集合中。
.Select(crtu => crtu.UserId)
这会丢弃您不需要的所有额外数据。它与SELECT UserId
完全相同.Contains(u.Id)
这会将子查询限制为仅搜索列表中的条目。它与原版中的(2,3,4))中的WHERE CompanyRoleId类似。
如果有任何部分需要更多澄清,请告诉我,我可以尝试提供更多帮助。