一:背景
1. 講故事
前幾天看同事在用 linq 給內(nèi)存中的兩個(gè) model 做左連接,用過的朋友都知道,你一定少不了一個(gè)叫做 DefaultIfEmpty 函數(shù),這玩意吧,本來很流暢的 from...in...join, 突然搞進(jìn)來這么一個(gè)函數(shù),真的是惡心他媽給惡心開門,惡心到家了,簡化后的代碼如下:
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<User>()
{
new User(){ UserID=1, Email="333@qq.com"},
new User(){ UserID=2, Email="444@qq.com"},
};
var orderList = new List<Order>()
{
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 };
}

之所以出現(xiàn)這個(gè)情況是因?yàn)椴还苁?查詢關(guān)鍵詞 還是 擴(kuò)展方法,都并沒有直接對(duì) leftjoin 和 rightjoin 底層支持,只能通過變通的方式去實(shí)現(xiàn),這就很尷尬了,比如說上面的這段代碼,你很難在多天之后還能準(zhǔn)確理解這里的 DefaultIfEmpty 是用來干嘛的,那現(xiàn)在問題的關(guān)鍵在于,有沒有什么方法讓底層支持或者有可信的第三方幫我封裝好,還真巧,在 github 上 還真有一個(gè) morelinq 項(xiàng)目:https://github.com/morelinq/MoreLINQ 看 md 是給 Enumerable 擴(kuò)展了 60,70 個(gè)方法,如虎添翼呀,接下來一起來探索下吧。
二: MoreLinq 下的探索
1. 安裝
安裝非常簡單,用 nuget 跑一下 Install-Package morelinq -Version 3.3.2 即可。
2. LeftJoin / RightJoin / FullJoin
在 morelinq 中就提供了 左外,右邊,全連接,這就很
|