在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