在 On 子句中使用多个条件进行 LINQ 连接

标签 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 文档。

最佳答案

您只需将匿名属性的两侧命名相同即可

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/

相关文章:

mysql - 我可以在 GROUP BY 和 ORDER BY 上强制使用 2 个单独的索引吗?

linux - 使用内连接连接两个 TSV 文件

c# - ASP.NET Web Api 连接两个表以创建一个对象数组

c# - 使用 groupby、sum 和 count 将 SQL 转换为 Linq

c# - 创建、组合和缓存 lambda 表达式

c# - List <int>分成三份

python - 在 SQLAlchemy 中连接表时,是否有一种方便的方法来仅对冲突的列进行别名?

json - PostgreSQL 9.4 : Aggregate/Join table on JSON field id inside array

c# - 具有一些相等键/值的配对列表?

mysql - 根据具有不同值的顺序连接两列