EF Core 10 中 LeftJoin 和 RightJoin 运算符在 LINQ 查询中的应用

笔记哥 / 04-29 / 20点赞 / 0评论 / 662阅读
## 前言 最近发现 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 ![](https://cdn.res.knowhub.vip/c/2505/06/19c9c085.png?G1cAAMTsdJxIfESabqMO2jvFHc2ARRpBpYT1es9Z%2byb6%2fgZGjs%2bofbb94Te1z0ZJpCR3AkM5IwRcQBYu5h4STFXUTOMaDQ%3d%3d) ![](https://cdn.res.knowhub.vip/c/2505/06/51297a03.png?G1YAAMTsdJyIfIim26hD2jvFHc2ARBZBpYT1es9Z%2byb6fkdCjs9offr%2b8JfWpxOLKJsREkrKCB4XkIWlaA2mbCwqEtdw) 需要安装最新的 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指定使用预发行版本 ![](https://cdn.res.knowhub.vip/c/2505/06/4cfab7b8.png?G1YAAETn9LwULGDGvtMdbIlTE20GJLIIKiWs13vO2jfR9wcYmp%2fR%2boz94S%2btz6AiUos7gWGsSB4XoKIw8yQqVR1e8xoB) ### 指定项目目标框架 ![](https://cdn.res.knowhub.vip/c/2505/06/88618aeb.png?G1cAAMTsdJxI8kKl26hD2jvFHc2ARRpBpYT1es9Z%2byb6fgdD4zNan74%2f%2fKb16SQpFTEjMDIrQkAFVPkqkCAVmkxhJa7h) ## GroupJoin + SelectMany + DefaultIfEmpty 实现左连接 > > > 实现原理:GroupJoin + SelectMany + DefaultIfEmpty 实现左连接。该模式包括在多个数据源之间创建 GroupJoin,然后通过对分组源使用 SelectMany 运算符与 DefaultIfEmpty 来平展分组,从而在内部不具有相关元素时匹配 null。 > - GroupJoin: 将两个序列按关联键进行分组连接,生成分组的嵌套结构。 - SelectMany: 将嵌套集合(如集合的集合)展开为单一序列。 - DefaultIfEmpty: 会生成一个 包含 null 的默认条目,确保左表记录不被过滤。 ```csharp                 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 运算符查询 ```csharp                 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 运算符查询 ```csharp                 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()); ``` ## 参考文章 - 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相关知识点欢迎查阅。 - 🚀C#/.NET/.NET Core拾遗补漏Gitee合集:https://gitee.com/ysgdaydayup/DotNetGuide/blob/main/docs/DotNet/DotNetStudy.md - 📚C#/.NET/.NET Core拾遗补漏GitHub合集:https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetStudy.md ![](https://cdn.res.knowhub.vip/c/2505/06/ff84cd91.png?G1YAAETn9LwUKGjGvtMdbIlTE20GJLIIKiWs13vO2jfR9wcYlp%2fR%2boz94S%2btzyBRreJOYBQ2JA8XFdOiBcmdxfRiz2sE)