EF Core 10 現(xiàn)已支持 LeftJoin 和 RightJoin 運(yùn)算符查詢(xún)了!
前言
最近發(fā)現(xiàn) EF Core 10 中的新增功能引入了在 LINQ 中支持 LeftJoin 和 RightJoin 運(yùn)算符查詢(xún)的新功能。在 EF Core 10 之前,開(kāi)發(fā)人員需要通過(guò)復(fù)雜的組合查詢(xún)實(shí)現(xiàn) LEFT JOIN 需要在特定配置中執(zhí)行SelectMany、GroupJoin 和 DefaultIfEmpty 操作。
本文咱們一起來(lái)看看在 EF Core 中使用 LeftJoin 和 RightJoin 運(yùn)算符進(jìn)行左右連接查詢(xún)的代碼簡(jiǎn)潔度。
環(huán)境準(zhǔn)備
在此之前我們需要先安裝 .NET 10 開(kāi)發(fā)環(huán)境。
圖片
圖片
需要安裝最新的 Visual Studio 2022 預(yù)覽版或者使用 Visual Studio Code 和 C# 開(kāi)發(fā)工具包擴(kuò)展或者使用 Rider 來(lái)配合 .NET 10 使用。
- Visual Studio 2022 預(yù)覽版:https://visualstudio.microsoft.com/zh-hans/vs/preview
- C# 開(kāi)發(fā)工具包擴(kuò)展:https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit
EF Core指定使用預(yù)發(fā)行版本
圖片
指定項(xiàng)目目標(biāo)框架
圖片
GroupJoin + SelectMany + DefaultIfEmpty 實(shí)現(xiàn)左連接
實(shí)現(xiàn)原理:GroupJoin + SelectMany + DefaultIfEmpty 實(shí)現(xiàn)左連接。該模式包括在多個(gè)數(shù)據(jù)源之間創(chuàng)建 GroupJoin,然后通過(guò)對(duì)分組源使用 SelectMany 運(yùn)算符與 DefaultIfEmpty 來(lái)平展分組,從而在內(nèi)部不具有相關(guān)元素時(shí)匹配 null。
- GroupJoin: 將兩個(gè)序列按關(guān)聯(lián)鍵進(jìn)行分組連接,生成分組的嵌套結(jié)構(gòu)。
- SelectMany: 將嵌套集合(如集合的集合)展開(kāi)為單一序列。
- DefaultIfEmpty: 會(huì)生成一個(gè) 包含 null 的默認(rèn)條目,確保左表記錄不被過(guò)濾。
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 創(chuàng)建分組關(guān)聯(lián)
.GroupJoin(
db.Teachers,
c => c.TeacherID,// 左表關(guān)聯(lián)鍵(Class 的 TeacherID)
t => t.TeacherID,// 右表關(guān)聯(lián)鍵(Teacher 的 TeacherID)
(c, teacherGroup) => new
{
Class = c,
Teachers = teacherGroup
})
// 第二步:SelectMany 展開(kāi)分組并處理空值
.SelectMany(
temp => temp.Teachers.DefaultIfEmpty(),// 確保即使無(wú)關(guān)聯(lián)教師也保留 Class 班級(jí)信息
(temp, t) => new
{
temp.Class,
Teacher = t
});LeftJoin 運(yùn)算符查詢(xún)
var newLeftJoinQuery = db.Classes
.LeftJoin(db.Teachers,
c => c.TeacherID,
t => t.TeacherID,
(c, t) => new
{
Class = c,
Teacher = t
});
Console.WriteLine("執(zhí)行SQL=>>> " + newLeftJoinQuery.ToQueryString());RightJoin 運(yùn)算符查詢(xún)
var newRightJoinQuery = db.Teachers
.RightJoin(db.Classes,
t => t.TeacherID,
c => c.TeacherID,
(t, c) => new
{
Teacher = t,
Class = c
});
Console.WriteLine("執(zhí)行SQL=>>> " + newRightJoinQuery.ToQueryString());























