具有多條件過濾的LINQ to SQL 左外連接
在LINQ to SQL 中,左外連接允許檢索所有左表中的記錄,即使右表中沒有符合的記錄。使用左外連接進行查詢時,可能需要對連接表套用額外的篩選條件。
考慮以下SQL 語句:
SELECT f.value FROM period AS p LEFT OUTER JOIN facts AS f ON p.id = f.periodid AND f.otherid = 17 WHERE p.companyid = 100
此查詢從「facts」表中的每筆記錄都包含在「period」表中,即使「facts」表中沒有符合的記錄。此外,它還套用了進一步的篩選器,僅包含「facts」表中「otherid」列等於 17 的記錄。
要將此查詢轉換為LINQ,可以執行以下步驟:
var query = 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 f.value;
與標準左外連接的主要區別在於,在呼叫DefaultIfEmpty() 之前,在連接表「fg 」上使用Where() 方法。這確保了在由於空聯接結果而可能排除任何記錄之前應用附加過濾條件。
另一種方法涉及使用子查詢:
var query = 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 f.value;
這兩種方法都實現了使用多個連接條件執行左外連接的期望結果。重要的是要了解,在 JOIN 之後的 WHERE 子句中放置附加過濾條件可能不會產生所需的行為,因為它可能會導致排除由於左外連接而應包含的記錄。
以上是如何使用多條件過濾執行 LINQ to SQL 左外連線?的詳細內容。更多資訊請關注PHP中文網其他相關文章!