EntityFramework(EF) Core 10支持LeftJoin和RightJoin运算符查询

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

安装 .NET 10 开发环境

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

.NET 10 微软官网下载:https://dotnet.microsoft.com/zh-cn/download/dotnet/10.0

EntityFramework(EF) Core 10支持LeftJoin和RightJoin运算符查询 使用示例

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

EF Core指定使用预发行版本

EntityFramework(EF) Core 10支持LeftJoin和RightJoin运算符查询 使用示例

指定项目的目标框架

EntityFramework(EF) Core 10支持LeftJoin和RightJoin运算符查询 使用示例

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());

参考文档

EF Core 10 中的新增功能:https://learn.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-10.0/whatsnew

评论