LINQ LEFTJOIN

  • 518
  • 0
  • 2017-06-05

在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