如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接

Posted

技术标签:

【中文标题】如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接【英文标题】:How do you perform a left outer join with a where clause using linq lambda extension methods 【发布时间】:2019-11-08 21:04:39 【问题描述】:

我在 sql 中有以下代码,我想进行 linq lambda 查询。有没有办法做到这一点?

SELECT *
FROM dbo.Idea i
    LEFT OUTER JOIN dbo.IdeaCollaborator ic
        ON ic.Idea_Id = i.Id
WHERE i.Submitter_Id = 'Peter'
      OR ic.User_Id = 'Peter';

我参考How do you perform a left outer join using linq extension methods

得到

db.Ideas
 .GroupJoin(
   db.IdeaCollaborators,
   i => i.Id,
   ic => ic.Idea_Id,
   (x, y) => new  Ideas = x, IdeaCollaborators = y )
 .SelectMany(
   x => x.IdeaCollaborators.DefaultIfEmpty(),
   (x, y) => new
    x.Ideas.Id, x.Ideas.IdeaStatus_Id, y.User_Id
 )

但我被卡住了

【问题讨论】:

【参考方案1】:

答案是在 where 的关系中使用 .FirstOrDefault(),因为在关系中 FirstOrDefault 与我们将从 select 中获取的项目相同,因此适用于 where 子句

db.Ideas
 .GroupJoin(
  db.IdeaCollaborators,
  i => i.Id,
  ic => ic.Idea_Id,
  (x, y) => new  Ideas = x, IdeaCollaborators = y )
 .Where(gj => gj.Ideas.Submitter_Id == "Peter" | gj.IdeaCollaborators.FirstOrDefault().User_Id == "Peter")
 .SelectMany(
  x => x.IdeaCollaborators.DefaultIfEmpty(),
  (x, y) => new
   x.Ideas.Id, x.Ideas.IdeaStatus_Id, y.User_Id )
);

【讨论】:

以上是关于如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接的主要内容,如果未能解决你的问题,请参考以下文章

这个带有 Join 的 Linq 查询如何写成 Lambda?

如何使用扩展在Linq Lambda中编写此SQL

EF下lambda与linq查询&&扩展方法

如何将带有内连接的 sql 查询转换为 linq lambda 表达式?

如何在 LINQ lambda 中执行多个表之间的联接

如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询