2017-08-30 2 views
0

これはシナリオです。 私は1対Mの関係に2つのテーブルを持っています。例示の目的のため左のEntity Framework 6でIS NULLとIS NOT NULLを生成する方法

MyHeaderTable(headerID、COL1、COL2)
MyDetailTable(lineID、headerID、statusID、COL3、COL4)子行は任意で

注(ヘッダレコードとしてそれらを定義することができますしたがってLEFT JOINを、対応するラインなしで存在し得る

をIは、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 

質問は、上記のT-SQLをEF6 linqに書き込む方法です。

私の試みが下に表示されますが、私はトラブルNULL ISとNULLではないとLINQクエリを生成が生じています:

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(); 

*、私はEFが進化している知っていると何に興味を持っていないEF6の特定のバージョンに注意してください。以前のバージョンはそうしました。

答えて

0

EFは、エンティティ自身が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 == null || (j != null && j.statusID != 2) 
      select; 
+1

これは "とんでもない" です!特定のフィールドではなく、エンティティレベルでnullをチェックします。うまく動作し、回答は受け入れられます。 – joedotnot