SQL的left join左連接查詢轉Linq

平時寫sql比較多,某些腳本一到C#裏面就不知道怎麼轉了。

本來開發時有一個左連接的腳本,比較複雜,爲了筆記效果,所以將腳本做一個簡化。

本來庫裏有兩個表TableA和TableB,兩個表的主鍵做如下關聯:

--TableA的主鍵ID爲TableB的外鍵Aid
SELECT ta.Id, ta.Name, tb.Id, tb.Name, tb.Aid, tb.IsDelete
FROM TableA ta
JOIN TableB tb ON ta.Id=tb.Aid

 

爲了查詢所有TableA及TableB的數據,但是當TableB中數據爲空或IsDelete=0時,需要能看所有TableA的數據,所以使用左連接。腳本如下:

--TableA的主鍵ID爲TableB的外鍵Aid
SELECT ta.Id, ta.Name, tb.Id, tb.Name, tb.Aid, tb.IsDelete
FROM TableA ta
JOIN TableB tb ON ta.Id=tb.Aid
WHERE (tb.Id IS NULL OR tb.IsDelete=0)

需要將上述的SQL轉爲Linq。
由於Linq中的左連接不能單獨判斷左聯表的一個字段,所以Linq不能是如下寫法:

var list = from a in TableA
           join b in TableB on a.Id equals b.Kid into tmp
           from t in tmp.DefaultIfEmpty()
           where (t.Id == null || t.IsDelete == false)
           select new
           {
               AID=ta.Id, 
               AName = ta.Name, 
               BID = tb.Id, 
               BName = tb.Name, 
               tb.IsDelete
           };


由於b表本身可能查詢出空的數據,這個時候去取t.Id就會報錯,因此正確的方法是:

var list = from a in TableA
           join b in TableB on a.Id equals b.Kid into tmp
           from t in tmp.DefaultIfEmpty()
           where (t == null || (t != null && t.IsDelete == false))
           select new
           {
               AID = ta.Id, 
               AName = ta.Name, 
               BID = tb.Id, 
               BName = tb.Name, 
               tb.IsDelete
           };

           
如果對你有幫助,點贊支持一下,謝謝!

發佈了43 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章