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

时间:2011-10-05 16:41:00

标签: linq join

我正在尝试在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 }

如何将&& t2.Completed == true添加到on子句?

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

4 个答案:

答案 0 :(得分:108)

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

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 }

答案 1 :(得分:28)

您可以在这里:

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 }

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这对于2张桌子工作正常。我有3个表,on子句必须链接3个表中的2个条件。 我的代码:

来自_dbContext.Products中的p 在p.ProduktId上的_dbContext.ProductVariants中加入pv等于pv.ProduktId 在leftJoinQuery中加入jpr 在新的{VariantId = pv.Vid,ProductId = p.ProduktId}上等于 将新的{VariantId = jpr.Prices.VariantID,ProductId = jpr.Prices.ProduktID}插入lj

但此时显示错误: 在p.ProduktId上的_dbContext.ProductVariants中加入pv等于pv.ProduktId

错误:join子句中的表达式之一的类型不正确。调用“ GroupJoin”时类型推断失败。