首页 文章

LINQ在On子句中加入多个条件

提问于
浏览
67

我正在尝试在LINQ中实现一个查询,该查询在ON子句中使用具有多个条件的左外连接 .

我将使用以下两个表Project(ProjectID,ProjectName)和Task(TaskID,ProjectID,TaskName,Completed)的示例 . 我想查看所有项目的完整列表及其各自的任务,但只查看已完成的任务 .

我无法使用 Completed == true 的过滤器,因为这将过滤掉任何没有完成任务的项目 . 相反,我想将 Completed == true 添加到连接的ON子句中,以便显示完整的项目列表,但只显示已完成的任务 . 没有完成任务的项目将显示一行,其中任务为空值 .

这是查询的基础 .

from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }

如何在on子句中添加 && t2.Completed == true

我似乎无法找到任何关于如何执行此操作的LINQ文档 .

3 回答

  • 26

    您只需要将双方的匿名属性命名为相同

    on new { t1.ProjectID, SecondProperty = true } equals 
       new { t2.ProjectID, SecondProperty = t2.Completed } into j1
    

    根据@svick的评论,这是另一个可能更有意义的实现:

    from t1 in Projects
    from t2 in Tasks.Where(x => t1.ProjectID == x.ProjectID && x.Completed == true)
                    .DefaultIfEmpty()
    select new { t1.ProjectName, t2.TaskName }
    
  • 97

    在这里你去:

    from b in _dbContext.Burden 
    join bl in _dbContext.BurdenLookups on
    new { Organization_Type = b.Organization_Type_ID, Cost_Type = b.Cost_Type_ID } equals
    new { Organization_Type = bl.Organization_Type_ID, Cost_Type = bl.Cost_Type_ID }
    
  • 1

    你不能这样做 . join 子句(和 Join() 扩展方法)仅支持equijoins . 这也是原因,为什么它使用 equals 而不是 == . 即使你可以做类似的事情,它也行不通,因为 join 是一个内连接,而不是外连接 .

相关问题