2018年10月16日 星期二

[LINQ] LEFT JOIN / GROUP JOIN

GroupJoin 可以得到與Left Join相似的結果,接下來只要使用 Select過濾GroupJoin 中的內容就可以得到想要的結果。
(使用DefaultIfEmpty 因匿名型別無法輸出NULL(無法轉換成強型別),需特別注意Null的處理)


例:

Dim Query = _

            From oe In dt1.AsEnumerable _

            Group Join i In dt2.AsEnumerable _

            On oe.Field(Of String)("employeeid") Equals i.Field(Of String)("employeeid") Into Group _

            From p In Group.DefaultIfEmpty() _


            Select 部門 = oe.Field(Of Int32)("Dep"), _

                   員工 = oe.Field(Of String)("employeeid"), _

                   早餐 = If(p Is Nothing, "", p.Field(Of String)("早餐")), _

                   午餐 = If(p Is Nothing, "", p.Field(Of String)("午餐")), _

                   晚餐 = If(p Is Nothing, "", p.Field(Of String)("晚餐"))


//array1 LEFT JOIN array2
var q = array1
            .Join(array2,
                     a1 => ID,
                     a2 => a2.id,
                     (a1, a2) => new{
                                         A= a1.ID,
                                         B= a1.employee_id,
                                         a2
                                       })
            .Where(x => x.Date < DateTime.Now)
            .Select(x => x);




當要撈出LEFT JOIN的值為空值的部分,可以加入 Where IsNothing(p) ,就可以撈出想要的資料。


例:

Dim qMaster = (From m In dtM.AsEnumerable _

                           Group Join l In dtL.AsEnumerable _

                           On m.Item("id") Equals l.Item("ID") Into Group _

                           From p In Group.DefaultIfEmpty() _

                           Where IsNothing(p) _

                           Select m).CopyToDataTable


沒有留言:

張貼留言

[Excel] 日期(數值)轉文字

Excel的日期格式真的常常使人抓狂, 在使用者輸入日期後該欄位真正的值會被Excel轉換成一串數字, 這串數字代表著自1900/1/1到該日期的總天數。 但程式或使用者真正要的,就不是這串數字, 他們就是要日期!要日期!! So, 為了取得真正的值只好使用TEXT函數來解決了 ...