平時寫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
};
如果對你有幫助,點贊支持一下,謝謝!