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
是一个内连接,而不是外连接。