前言

最近发现 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. shell学习之保存数据库

    自动备份 Mysql 数据库脚本 #!/bin/bash #author by wxp #used to backup mysql practise USER=root PASSWD=1234 HOS ...

  2. Linux驱动---/sys接口

    目录 一.伪文件 sys 二.led_classdev结构体 三.注册/注销LED 3.1.led_classdev_register 函数 3.2.led_classdev_unregister 函 ...

  3. JUC并发—9.并发安全集合二

    大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5. ...

  4. 在Android源码中为APK编译系统权限

    系统权限获取 打包为APK进行系统签名 对于 部分功能的访问需要使用到系统权限,需要 添加 android:sharedUserId="android.uid.system" 权限 ...

  5. 基于C语言实现UDP服务器

    UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,适用于对实时性有较高要求的应用场景,如视频流传输.语音通信.在线游戏等.与TCP不同,UDP不保证数据的 ...

  6. python 读写csv文件(创建,追加,覆盖)

    读取csv文件 利用 csv.reader 可以读 csv 文件,然后返回一个可迭代的对象 csv_read,我们可以直接从 csv_read 中取数据 import csv def read_csv ...

  7. CompletableFuture API介绍及使用

    1. 介绍 CompletableFuture 是 Java 8 引入的一个用于异步编程的类,位于 java.util.concurrent 包中.它是对 Future 的增强,提供了更强大的功能来支 ...

  8. python实现排列组合--itertools

    这是一个python自带的工具集,简单好用功能强大,能够大大提升编写代码效率. 功能不止排列组合,其他的用用加深理解了再整理. 官方文档:https://docs.python.org/zh-cn/3 ...

  9. docker swarm CA证书到期

    1.现象 在portain平台查看日志,发现一些节点日志无法查看报错为:Error grabbing logs: rpc error: code = Unknown desc = warning: i ...

  10. [源码系列:手写spring] AOP第一节:切点表达式

    在本专栏之前的文章中已经带大家熟悉了Spirng中核心概念IOC的原理以及手写了核心代码,接下来将继续介绍Spring中另一核心概念AOP.         AOP即切面编程是Spring框架中的一个 ...