LINQ在On子句中join了多个条件

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

我将使用以下两个表Project (ProjectID,ProjectName)和Task (TaskID,ProjectID,TaskName,Completed)的示例。 我希望看到所有项目的完整列表以及他们各自的任务,但只有那些已经完成的任务。

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

这是查询的基础。

 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

我似乎无法find任何关于如何做到这一点的LINQ文档。

你只需要在两边命名匿名属性相同

 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 } 

在这里,你去与:

 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 } 

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