[英]SQL to LINQ - Left Join Before Inner Join
所以我有一個SQL查詢,我想轉換為LINQ。
這是查詢:
SELECT *
FROM DatabaseA.SchemaA.TableA ta
LEFT OUTER JOIN DatabaseA.SchemaA.TableB tb
ON tb.ShipId = ta.ShipId
INNER JOIN DatabaseA.SchemaA.TableC tc
ON tc.PostageId= tb.PostageId
WHERE tc.PostageCode = 'Package'
AND ta.MailId = 'Specification'
我正在努力解決的問題是我似乎無法弄清楚如何在內連接之前在LINQ中進行左連接,因為在LINQ中進行左連接至少對我來說不是那么清楚。
我找到了許多LINQ內連接然后左連接的例子,但沒有左連接,然后是內連接。
如果它有幫助,這是我一直在玩的LINQ查詢:
var query = from m in tableA
join s in tableB on m.ShipId equals s.ShipId into queryDetails
from qd in queryDetails.DefaultIfEmpty()
join p in tableC on qd.PostageId equals p.PostageId
where m.MailId == "Specification" && p.PostageCode == "Package"
select m.MailId;
我嘗試了幾種不同的方法,但我在qd.PostageId上不斷收到“對象引用沒有設置為對象的實例”錯誤。
LINQ對我來說很新,我喜歡學習它,所以對此有任何幫助都會非常感激。 謝謝!
從我的SQL轉換配方 :
AND
相等測試的JOIN
條件必須使用join之外的where
子句,或者使用cross product( from
... from
...)然后where
AND
ed相等性測試的JOIN
條件轉換為匿名對象 LEFT JOIN
通過使用模擬into
joinvariable和從做另一個from
所述joinvariable接着.DefaultIfEmpty()
JOIN
子句的順序不會改變您翻譯它們的方式:
var ans = from ta in TableA
join tb in TableB on ta.ShipId equals tb.ShipId into tbj
from tb in tbj.DefaultIfEmpty()
join tc in TableC on tb.PostageId equals tc.PostageId
where tc.PostageCode == "Package" && ta.MailId == "Specification"
select new { ta, tb, tc };
但是,因為LEFT JOIN
之前,執行INNER JOIN
,然后NULL
PostageId
S IN TableB
,提供無與倫比的行絕不會匹配任何行TableC
,它變成相當於一個INNER JOIN
和,意為:
var ans2 = from ta in tableA
join tb in tableB on ta.ShipId equals tb.ShipId
join tc in tableC on tb.PostageId equals tc.PostageId
where tc.PostageCode == "Package" && ta.MailId == "Specification"
select new { ta, tb, tc };
采用:
var query = from m in tableA
join s in tableB on m.ShipId equals s.ShipId
join p in tableC on s.PostageId equals p.PostageId
where m.MailId == "Specification" && p.PostageCode == "Package"
select m.MailId;
您的查詢使用LEFT OUTER JOIN
但它不需要它。
實際上,由於你的tc.PostageCode = 'Package'
子句,它將作為INNER JOIN
。 如果您與WHERE
子句中的表中的列值進行比較(並且沒有OR
子句,並且您沒有與NULL
進行比較),則實際上所有到達該表的連接都將被視為INNER
)。
如果TableB
為null
(這就是你使用LEFT OUTER JOIN
和INNER JOIN
),那么該子句永遠不會成立 - 所以你應該使用INNER JOIN
來簡化問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.