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

Kuy*_*nda 80 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 }
Run Code Online (Sandbox Code Playgroud)

如何添加&& t2.Completed == trueon子句?

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

Adu*_*cci 115

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

on new { t1.ProjectID, SecondProperty = true } equals 
   new { t2.ProjectID, SecondProperty = t2.Completed } into j1
Run Code Online (Sandbox Code Playgroud)

根据@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 }
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是一种非常明显的方式.我不确定我会理解它的假设. (2认同)
  • 令人困惑的是,作为由“and”连接的两个等式,它确实更有意义,而不是某个“奇怪”对象的等式。为了证明我的观点,你的代码是错误的。为了让它工作,你必须在左侧有“true”,在右侧有“t2.Complete”。 (2认同)
  • 谢谢阿杜奇。我必须交换查询中的双方才能获得正确的上下文,但这确实有效。这个问题被简化了,在我的现实世界问题中,不仅仅是 SecondProperty 是 true 或 false,SecondProperty 是一个整数,我使用“AND SecondProperty IN (123, 456)”。我将继续迎接这一挑战,如果您能提供任何帮助,我将不胜感激。 (2认同)

Nal*_*ran 32

在这里你去:

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 }
Run Code Online (Sandbox Code Playgroud)

  • 这看起来更容易理解。 (3认同)