【问题标题】:linq subquery syntax explanationlinq 子查询语法解释
【发布时间】:2016-03-21 10:51:23
【问题描述】:

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

以下是我遵循的子查询以及我所理解的内容。

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:我使用了其他人的代码,以便我可以提供一个简单的问题示例。我的代码很复杂。谢谢。

【问题讨论】:

    标签: c# asp.net-mvc linq


    【解决方案1】:

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

    .Select(crtu =>  crtu.UserId)
    

    这将丢弃您不需要的所有额外数据。它的作用与 SELECT UserId 完全相同

    .Contains(u.Id)
    

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

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

    【讨论】:

    • 非常感谢,这是一个愚蠢的问题,我终于意识到where 用于外键,selectcontain 用于过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多