如何使用 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?