我正在尝试在 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 文档。
最佳答案
您只需将匿名属性的两侧命名相同即可
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 }
关于在 On 子句中使用多个条件进行 LINQ 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7664727/