找回密码
 立即注册
首页 业界区 业界 EF Core 10 现已支持 LeftJoin 和 RightJoin 运算符查询 ...

EF Core 10 现已支持 LeftJoin 和 RightJoin 运算符查询了!

拓拔梨婷 2025-6-2 22:45:02
前言

最近发现 EF Core 10 中的新增功能引入了在 LINQ 中支持 LeftJoin 和 RightJoin 运算符查询的新功能。在 EF Core 10 之前,开发人员需要通过复杂的组合查询实现 LEFT JOIN 需要在特定配置中执行SelectMany、GroupJoin 和 DefaultIfEmpty 操作。
本文咱们一起来看看在 EF Core 中使用 LeftJoin 和 RightJoin 运算符进行左右连接查询的代码简洁度。
环境准备

在此之前我们需要先安装 .NET 10 开发环境。

  • https://dotnet.microsoft.com/zh-cn/download/dotnet/10.0
1.png

2.png

需要安装最新的 Visual Studio 2022 预览版或者使用 Visual Studio Code 和 C# 开发工具包扩展或者使用 Rider 来配合 .NET 10 使用。

  • Visual Studio 2022 预览版:https://visualstudio.microsoft.com/zh-hans/vs/preview
  • C# 开发工具包扩展:https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit
EF Core指定使用预发行版本

3.png

指定项目目标框架

4.png

GroupJoin + SelectMany + DefaultIfEmpty 实现左连接

实现原理:GroupJoin + SelectMany + DefaultIfEmpty 实现左连接。该模式包括在多个数据源之间创建 GroupJoin,然后通过对分组源使用 SelectMany 运算符与 DefaultIfEmpty 来平展分组,从而在内部不具有相关元素时匹配 null。


  • GroupJoin: 将两个序列按关联键进行分组连接,生成分组的嵌套结构。
  • SelectMany: 将嵌套集合(如集合的集合)展开为单一序列。
  • DefaultIfEmpty: 会生成一个 包含 null 的默认条目,确保左表记录不被过滤。
  1.                 var leftJoinQuery = from c in db.Classes<br>                                    join t in db.Teachers on c.TeacherID equals t.TeacherID into teacherGroup<br>                                    from t in teacherGroup.DefaultIfEmpty()<br>                                    select new<br>                                    {<br>                                        c,<br>                                        t<br>                                    };<br><br>                var leftJoinQuery2 = db.Classes<br>                    // 第一步:GroupJoin 创建分组关联<br>                    .GroupJoin(<br>                    db.Teachers,<br>                    c => c.TeacherID,// 左表关联键(Class 的 TeacherID)<br>                    t => t.TeacherID,// 右表关联键(Teacher 的 TeacherID)<br>                    (c, teacherGroup) => new<br>                    {<br>                        Class = c,<br>                        Teachers = teacherGroup<br>                    })<br>                    // 第二步:SelectMany 展开分组并处理空值<br>                    .SelectMany(<br>                    temp => temp.Teachers.DefaultIfEmpty(),// 确保即使无关联教师也保留 Class 班级信息<br>                    (temp, t) => new<br>                    {<br>                        temp.Class,<br>                        Teacher = t<br>                    });<br>
复制代码
LeftJoin 运算符查询
  1.                 var newLeftJoinQuery = db.Classes<br>                   .LeftJoin(db.Teachers,<br>                   c => c.TeacherID,<br>                   t => t.TeacherID,<br>                   (c, t) => new<br>                   {<br>                       Class = c,<br>                       Teacher = t<br>                   });<br><br>                Console.WriteLine("执行SQL=>>> " + newLeftJoinQuery.ToQueryString());<br>
复制代码
RightJoin 运算符查询
  1.                 var newRightJoinQuery = db.Teachers<br>                    .RightJoin(db.Classes,<br>                    t => t.TeacherID,<br>                    c => c.TeacherID,<br>                    (t, c) => new<br>                    {<br>                        Teacher = t,<br>                        Class = c<br>                    });<br><br>                Console.WriteLine("执行SQL=>>> " + newRightJoinQuery.ToQueryString());<br>
复制代码
参考文章


  • https://github.com/dotnet/efcore/issues/35379
  • https://learn.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-10.0/whatsnew
C#/.NET/.NET Core拾遗补漏

本文已收录至C#/.NET/.NET Core拾遗补漏合集中,更多C#/.NET/.NET Core相关知识点欢迎查阅。
<ul>
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册