簡體   English   中英

SQL到LINQ - 內連接之前的左連接

[英]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轉換配方

  1. 不是所有與AND相等測試的JOIN條件必須使用join之外的where子句,或者使用cross product( from ... from ...)然后where
  2. 應將兩個表之間的多個AND ed相等性測試的JOIN條件轉換為匿名對象
  3. 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 )。

如果TableBnull (這就是你使用LEFT OUTER JOININNER JOIN ),那么該子句永遠不會成立 - 所以你應該使用INNER JOIN來簡化問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM