On 子句中具有多个条件的 LINQ 连接

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

我将使用以下两个表 工程项目(ProjectID,ProjectName)和 任务(TaskID,ProjectID,TaskName,Completed)的示例。我希望看到所有项目及其各自任务的完整列表,但仅限于那些已完成的任务。

我不能使用 Completed == true过滤器,因为它会过滤掉任何没有完成任务的项目。相反,我想将 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

我似乎找不到任何 LINQ 文档关于如何做到这一点。

192874 次浏览

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

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 }

你不能这么做。join子句(和 Join()扩展方法)只支持等值连接。这也是为什么它使用 equals而不是 ==的原因。即使您可以这样做,也不会起作用,因为 join是内部连接,而不是外部连接。

Here you go with:

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 }