前言

最近发现 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());

参考文章

 

EF Core 10 现已支持 LeftJoin 和 RightJoin 运算符查询了!的更多相关文章

  1. EF Core 2.1 支持数据库一对一关系

    在使用EF Core和设计数据库的时候,通常一对多.多对多关系使用得比较多,但是一对一关系使用得就比较少了.最近我发现实际上EF Core很好地支持了数据库的一对一关系. 数据库 我们先来看看SQL ...

  2. EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真

    EF Core使用SQL调用返回其他类型的查询   假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...

  3. 最新版的EF Core对UWP支持的怎么样

    为啥写这篇帖子呢?其实是因为翻微软的文档中心偶然翻到的,于是就出于好奇就试试了,看看用着怎么样. 以前没注意图片,所以我今天发现的时候,显示EF Core3.1支持standard2.0,于是就想试试 ...

  4. EF Core 三 、 骚操作 (导航属性,内存查询...)

    EF Core 高阶操作 本文之前,大家已经阅读了前面的系列文档,对其有了大概的了解 我们来看下EF Core中的一些常见高阶操作,来丰富我们业务实现,从而拥有更多的实现选择 1.EF 内存查找 wh ...

  5. EF Core使用SQL调用返回其他类型的查询

    假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法是编写 ADO.NET 代码,并从 EF 获取数据库 ...

  6. 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

  7. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

  8. EF Core 1.0中使用Include的小技巧

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...

  9. 利用EF Core的Join进行多表查询

    背景 话说有这么一家子,老公养了一条狗,老婆养了一只猫. 数据库的设计 人表 宠物表 通过表可以知道,宠物通过Owner指向主人的Id. 问题来了,我要和故事开头一样,老公-狗,老婆-猫,对应起来,怎 ...

  10. .net core Entity Framework 与 EF Core

    重点讲 Entity Framework Core ! (一)Entity Framework 它是适用于.NET 的对象关系映射程序 (ORM),现在的EF6已经是久经沙场,并经历重重磨难,获得一致 ...

随机推荐

  1. DBeaver连接PostgreSQL后只有默认数据库“postgres”不显示其他数据库的问题解决办法

    我们在使用DBeaver连接PostgreSQL后,发现数据库中只有"postgres"默认数据库,不显示我们自己创建的数据库. 1.问题描述 我们在使用DBeaver连接Post ...

  2. MySQL安装-centos7

    mysql centos7上安装有3中方法  1yum安装 2rpm安装 3编译安装 方法一 rpm安装 1.查找以前是否安装有mysql,使用下面命令:rpm –qa | grep -i mysql ...

  3. USACO24DEC Cake Game S 题解 [ 黄 ] [ 前缀和 ] [ adhoc ]

    Cake Game:小清新前缀和题,但是我场上想了半天优先队列贪心假完了 /ll/ll/ll. 观察 本题有三个重要的结论,我们依次进行观察. 不难发现,第二个牛一定会拿 \(\frac{n}{2}- ...

  4. QT5笔记:2.可视化UI设计

    2.可视化UI设计 参考视频:https://www.bilibili.com/video/BV1AX4y1w7Nt 窗口的三种类型,每种类型窗体拥有的方法不同: MainWindow:指的是正常窗体 ...

  5. Typecho实现版权声明的三种方式

    在安装完Typecho之后,第一件事应该就是想着如何去折腾了.对于个人博客而言,不希望自己辛辛苦苦写的文章,被别人转载或无脑采集,还不留原地址,所以就需要在文章的末尾地方放上一个版权声明,来提醒下转载 ...

  6. JavaGUI - [02] 案例Demo

    题记部分 一.WindowDemo 窗口 package com.harley; import java.awt.*; /** * @author harley * @date 2024/05/06 ...

  7. 05 过拟合(over-fitting)与正则化(regularization)

    1. 什么是Overfitting 我们希望神经网络模型能够找到数据集中的一般规律,从而帮助我们预测未知数据.这个过程是通过不断地迭代优化损失函数(也就是预测值和实际值的误差)而实现的.然而随着误差进 ...

  8. bug|初始化项目|sass-loader报错:TypeError: this.getResolve is not a function at Object.loader

    Module build failed: TypeError: this.getResolve is not a function at Object.loader的解决 npm uninstall ...

  9. 深入理解Hadoop读书笔记-1

    背景 公司的物流业务系统目前实现了使用storm集群进行过门事件的实时计算处理,但是还有一个需求,我们需要存储每个标签上传的每条明细数据,然后进行定期的标签报表统计,这个是目前的实时计算框架无法满足的 ...

  10. 【SpringMVC】表单标签 & 处理静态资源

    SpringMVC 表单标签 &处理静态资源 使用 Spring 的表单标签 • 通过 SpringMVC 的表单标签可以实现将模型数据中的属性和 HTML 表单元素相绑定,以实现表单数据更便 ...