Linq 下的擴充套件方法太少了,您期待的 MoreLinq 來啦
阿新 • • 發佈:2020-09-07
## 一:背景
### 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 中就提供了 左外,右邊,全連線,這就很