1. 程式人生 > >Linq 下的擴充套件方法太少了,您期待的 MoreLinq 來啦

Linq 下的擴充套件方法太少了,您期待的 MoreLinq 來啦

## 一:背景 ### 1. 講故事 前幾天看同事在用 linq 給記憶體中的兩個 model 做左連線,用過的朋友都知道,你一定少不了一個叫做 `DefaultIfEmpty` 函式,這玩意吧,本來很流暢的 from...in...join, 突然搞進來這麼一個函式,真的是噁心他媽給噁心開門,噁心到家了,簡化後的程式碼如下: ``` C# class User { public int UserID { get; set; } public string Email { get; set; } } class Order { public int OrderID { get; set; } public string OrderTitle { get; set; } public int UserID { get; set; } } static void Main(string[] args) { var userList = new List() { new User(){ UserID=1, Email="[email protected]"}, new User(){ UserID=2, Email="[email protected]"}, }; var orderList = new List() { new Order(){ OrderID=1, OrderTitle="訂單1", UserID=1}, new Order(){ OrderID=2, OrderTitle="訂單2", UserID=1} }; var query = from u in userList join o in orderList on u.UserID equals o.UserID into grp from item in grp.DefaultIfEmpty() select new { UserID = u.UserID, OrderTitle = item?.OrderTitle }; } ``` ![](https://img2020.cnblogs.com/other/214741/202009/214741-20200907095553487-1841438638.png) 之所以出現這個情況是因為不管是 查詢關鍵詞 還是 擴充套件方法,都並沒有直接對 leftjoin 和 rightjoin 底層支援,只能通過變通的方式去實現,這就很尷尬了,比如說上面的這段程式碼,你很難在多天之後還能準確理解這裡的 `DefaultIfEmpty` 是用來幹嘛的,那現在問題的關鍵在於,有沒有什麼方法讓底層支援或者有可信的第三方幫我封裝好,還真巧,在 github 上 還真有一個 morelinq 專案:https://github.com/morelinq/MoreLINQ,看 md 是給 Enumerable 擴充套件了 60,70 個方法,如虎添翼呀,接下來一起來探索下吧。 ## 二: MoreLinq 下的探索 ### 1. 安裝 安裝非常簡單,用 nuget 跑一下 ` Install-Package morelinq -Version 3.3.2 ` 即可。 ### 2. LeftJoin / RightJoin / FullJoin 在 morelinq 中就提供了 左外,右邊,全連線,這就很