2017-08-30 160 views
0

這是場景。 我有兩個表,1對M關係;如何在LEFT JOIN中的實體框架6中生成IS NULL和IS NOT NULL

爲了便於說明讓它們定義爲

MyHeaderTable(headerID,COL1,COL2)
MyDetailTable(lineID,headerID,statusID,COL3,COL4)

注子行是可選的(頭記錄可能存在沒有相應的線,因此,LEFT JOIN

我對下面的結果集,使用T-SQL:

SELECT MyHeaderTable h 
    LEFT JOIN MyDetailTable c ON h.headerID = c.headerID 
    WHERE c.lineID IS NULL -- no corresponding children 
    OR (c.lineID is NOT NULL AND c.statusID != 2) -- children rows must have status NOT 2 

問題是我如何在EF6 linq中編寫上述T-SQL?

我嘗試下面的顯示,但我無法生成LINQ查詢與IS NULL和IS NOT NULL:

var query = from h in ctx.MyHeaderTable 
      join c in ctx.MyDetailTable on h.headerID equals c.headerID into joinedTbl 
      from j in joinedTbl.DefaultIfEmpty() //LEFT JOIN 
      where j.lineID is null 
      || (j.lineID != null && j.statusID !=2) 
      select; 
var results = query.ToList(); 

*注EF6的特定版本,我知道EF已經演變以及在什麼不感興趣早期的版本。

回答

0

當檢查實體本身爲空時,EF會自動創建正確的查詢。

您的查詢應該是:

var query = from h in ctx.MyHeaderTable 
      join c in ctx.MyDetailTable on h.headerID equals c.headerID into joinedTbl 
      from j in joinedTbl.DefaultIfEmpty() //LEFT JOIN 
      where j == null || (j != null && j.statusID != 2) 
      select; 
+1

這是 「荒謬」!所以在實體級別檢查爲空而不是特定的字段。偉大的作品,答案被接受。 – joedotnot