2023年4月8日 星期六

使用LINQ 達到Left Join 的效果(GroupJoin)

LINQ 的Join() 方法其效果等同於 SQL 的 INNER JOIN ,若有類似 Left Join 或Right Join 的效果話,

那使用 GroupJoin 會是一個解法,



測試要將兩個集合 deps、emps,整理成以下的結果


依上面結果,可以看出是以 emps 集合為主,列出每項對應的 department ,可使用 GroupJoin() 來達到效果


其中,GroupJoin() 方法中,第一個參數為欲比對的集合,第二個參數為來源集合的 delegate,第三個參數為

欲比對集合的 delegate ,需要注意,第二與第三個參數需要填入兩個集合,可以用來 join 來屬性值,

如 emps 依據 Department_ID,deps 依據 ID ;

最後一個參數就是 callback delegate ,callback 中夾帶兩個引數,em 代表 emps 的每個元素,

depsCollection 代表符合該em Department_ID 的值所有項目,故左邊帶入右邊,使用匿名物件回傳

em.ID、em.Name、depsCollection


最後的最後,使用 SelectMany() 方法來拉平depsCollection,值得注意的是,在第一個參數中,當

遇到元素的屬性 depsCollection 若為null 的時候,new 一個Department 給它,此時的Name 會是 “none”;

而第三個參數,就是回傳匿名類別並對應相關屬性



若是使用 Linq 的查詢語法可以怎麼寫呢?如下所示,

其中也是很直覺,關鍵應該是 「into」,而且語法上閱讀起來負擔似乎輕



最後,若要做到 Right Join 效果的話,其實就是將主要集合跟欲比對集合交換,後續再將要列出的資訊微調即可




沒有留言:

張貼留言