LINQ to SQL:掌握具有多個條件的左外連線
將 SQL 查詢轉換為 LINQ to SQL 可能很棘手,尤其是對於複雜的聯結。本文重點討論一個常見場景:執行具有多個條件的左外連接。
SQL 挑戰:
我們的起點是在「period」表和「facts」表之間使用左外連接的 SQL 查詢。 連線使用兩個條件:「p.id = f.periodid」和「f.otherid = 17」。第二個條件充當過濾器。
LINQ 障礙:
LINQ 的 DefaultIfEmpty()
方法是左外連接的常用方法。然而,簡單地將 'f.otherid = 17' 加到 where
子句 after 連線無法如預期運作。
有效的 LINQ 解:
關鍵是使用在之前應用第二個連接條件DefaultIfEmpty()
。 這裡有兩個有效的方法:
方法一:使用擴充方法語法:
from p in context.Periods join f in context.Facts on p.id equals f.periodid into fg from fgi in fg.Where(f => f.otherid == 17).DefaultIfEmpty() where p.companyid == 100 select fgi.value
方法 2:使用子查詢:
from p in context.Periods join f in context.Facts on p.id equals f.periodid into fg from fgi in (from f in fg where f.otherid == 17 select f).DefaultIfEmpty() where p.companyid == 100 select fgi.value
為什麼有效:
關鍵的區別在於條件的位置。 將 'f.otherid == 17' 放在 where
子句 after DefaultIfEmpty()
中將過濾掉 'f' 為 null 的行(因為連線未找到符合項目)。 透過將其放在 Where()
子句 before DefaultIfEmpty()
中,我們在引入 null 值之前過濾 before,確保正確的左外連接行為。 請注意,我們選擇 fgi.value
而不是 f.value
來正確處理第一個方法中的空值。
以上是如何在 LINQ to SQL 中執行具有多個條件的左外連線?的詳細內容。更多資訊請關注PHP中文網其他相關文章!