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


 

前言

最近发现 EF Core 10 中的新增功能引入了在 LINQ 中支持 LeftJoin 和 RightJoin 运算符查询的新功能。在 EF Core 10 之前,开发人员需要通过复杂的组合查询实现 LEFT JOIN 需要在特定配置中执行SelectManyGroupJoin 和 DefaultIfEmpty 操作。

本文咱们一起来看看在 EF Core 中使用 LeftJoin 和 RightJoin 运算符进行左右连接查询的代码简洁度。

环境准备

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

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

EF Core指定使用预发行版本

指定项目目标框架

GroupJoin + SelectMany + DefaultIfEmpty 实现左连接

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

  • GroupJoin: 将两个序列按关联键进行分组连接,生成分组的嵌套结构。
  • SelectMany: 将嵌套集合(如集合的集合)展开为单一序列。
  • DefaultIfEmpty: 会生成一个 包含 null 的默认条目,确保左表记录不被过滤。
                var leftJoinQuery = from c in db.Classes
                                    join t in db.Teachers on c.TeacherID equals t.TeacherID into teacherGroup
                                    from t in teacherGroup.DefaultIfEmpty()
                                    select new
                                    {
                                        c,
                                        t
                                    };

                var leftJoinQuery2 = db.Classes
                    // 第一步:GroupJoin 创建分组关联
                    .GroupJoin(
                    db.Teachers,
                    c => c.TeacherID,// 左表关联键(Class 的 TeacherID)
                    t => t.TeacherID,// 右表关联键(Teacher 的 TeacherID)
                    (c, teacherGroup) => new
                    {
                        Class = c,
                        Teachers = teacherGroup
                    })
                    // 第二步:SelectMany 展开分组并处理空值
                    .SelectMany(
                    temp => temp.Teachers.DefaultIfEmpty(),// 确保即使无关联教师也保留 Class 班级信息
                    (temp, t) => new
                    {
                        temp.Class,
                        Teacher = t
                    });

LeftJoin 运算符查询

                var newLeftJoinQuery = db.Classes
                   .LeftJoin(db.Teachers,
                   c => c.TeacherID,
                   t => t.TeacherID,
                   (c, t) => new
                   {
                       Class = c,
                       Teacher = t
                   });

                Console.WriteLine("执行SQL=>>> " + newLeftJoinQuery.ToQueryString());

RightJoin 运算符查询

                var newRightJoinQuery = db.Teachers
                    .RightJoin(db.Classes,
                    t => t.TeacherID,
                    c => c.TeacherID,
                    (t, c) => new
                    {
                        Teacher = t,
                        Class = c
                    });

                Console.WriteLine("执行SQL=>>> " + newRightJoinQuery.ToQueryString());

参考文章

C#/.NET/.NET Core拾遗补漏

本文已收录至C#/.NET/.NET Core拾遗补漏合集中,更多C#/.NET/.NET Core相关知识点欢迎查阅。

DotNetGuide技术社区

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群👪

作者名称:追逐时光者

作者简介:一个热爱编程、善于分享、喜欢学习、探索、尝试新事物和新技术的全栈软件工程师。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如果该篇文章对您有帮助的话,可以点一下右下角的【♥推荐♥】,希望能够持续的为大家带来好的技术文章,文中可能存在描述不正确的地方,欢迎指正或补充,不胜感激。

posted on 2025-05-06 21:01  漫思  阅读(22)  评论(0)    收藏  举报

导航