我正在尝试在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文档。
答案 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”时类型推断失败。