在LINQ內實作LEFTJOIN,並且解決 "無法將 Null 值指派給型別 System.Boolean 的成員" 的問題
今天有一個需求要用到LINQ來實作LEFTJOIN,剛好要JOIN的Table內有bool型態的欄位,
碰到一些問題,把解決的方法紀錄一下
我有兩個Table:APSUB 跟 APSUB_SETTING,
第一個Table:APSUB一定會有資料,但是第二個Table:APSUB_SETTING 可能沒有資料
T-SQL的語法想要做到的效果如下:
SELECT T_0.APID,
T_0.SUBAPNAME,
T_1.IS_WM,
T_1.BANKGROUP
FROM APSUB T_0
LEFT JOIN APSUB_SETTING T_1 ON T_0.APID = T_1.APID
WHERE T_0.APID = 'AAA'
執行結果如下:
在條件APID = AAA 的情境之下,帶出APSUB的資料,APSUB_SETTING沒有資料就帶出NULL
在保哥的文章(註1)裏面有參考到LEFT JOIN的作法
LINQ語法如下:
var query = from _apsub in APSUBs.AsQueryable()
join _apsub_set in APSUB_SETTINGs
/*如果有兩個以上的欄位,用逗號隔開來*/
on new { APID = _apsub.APID, APSUBID = _apsub.SUBAPID } equals
new { APID = _apsub_set.APID, APSUBID = _apsub_set.APSUBID }
into left_order
from _apsub_set in left_order.DefaultIfEmpty()
where _apsub.APID == "AAA"
select new {
APID = _apsub.APID,
APSUB_NAME = _apsub.SUBAPNAME,
IS_WM = _apsub_set.IS_WM,
BANKGROUP = _apsub_set.BANKGROUP
};
query.Dump();
但是實作的時候出現以下的問題:
錯誤是出現我的欄位IS_WM 型態是Boolean,如果把Boolean欄位除的話可正常執行結果
於是我又繼續查了一下,如果將Boolean的型態轉型
解法也很簡單,只要在Boolean欄位那邊判斷一下即可(如果是空值預設帶NULL)
IS_WM = _apsub_set == null ? false :_apsub_set.IS_WM,
整段語法如下:
var query = from _apsub in APSUBs.AsQueryable()
join _apsub_set in APSUB_SETTINGs on _apsub.APID equals _apsub_set.APID into ps
from _apsub_set in ps.DefaultIfEmpty()
where _apsub.APID == "AAA"
select new {
APID = _apsub.APID,
APSUB_NAME = _apsub.SUBAPNAME,
IS_WM = _apsub_set == null ? false :_apsub_set.IS_WM,
BANKGROUP = _apsub_set.BANKGROUP
};
query.Dump();
執行結果:
以上,打完收工。
註1 參考文章 保哥文章出處: http://blog.miniasp.com/post/2010/10/14/LINQ-to-SQL-Query-Tips-INNER-JOIN-and-LEFT-JOIN.aspx