2016-10-13 14 views
1

SQLから来るLinqは比較的新しいです。だから、私は左を把握しようとしていることは、次のために参加する: Linq左寄せ右がヌル

SELECT * from MASTER m 
LEFT JOIN CHILD C 
    ON m.ID=C.MASTER_ID 
WHERE C.MASTER_ID is null 

だから、通常これは、子供を持っていないマスターからのすべてのレコードを返します。 .DefualtIfEmpty()が見つかりましたが、子を持つマスターレコードは削除されません。

私はの線に沿って開始しました:

var recs=from m in MASTER 
     from c in child 
      .where (mapping=>mapping.MasterId == m.Id) 
      .DefaultIfEmpty() 
     select new { MasterId = m.Id}; 

しかし、それは私の知る限りだと捕まってしまったようです。 .DefaultIfEmpty()は私が探しているものではないと仮定しています。 注:マスター表には数百万行もあります。子供たちは同じ数に近いです。理想的には、生成されたSQLは私が投稿したSQLのように見えるでしょう。

ありがとうございます。

+0

msdnのWebサイトを参照してください。https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

答えて

1

これは、子なしのすべてのマスターレコードを提供します。

var recs = MASTER.Where(x => !child.Any(y => m.Id == c.MasterId)); 

!Anyは、あなたがこのタイプのチェックのために得ることができる最高である実行計画にanti semi joinに変換されますnot Exists SQL文を生成します。

+0

私はそれが生成するSQLのクエリプランを見て、それを得ることができるように最適化されたように見えます。今ではいくつかのインデックスを置いて、私は金になると思う。ありがとう。 –

2

あなたがEFを使用している場合は、子を表すナビゲーションプロパティを使用して、子供を持っていないマスター取得することができます:あなたが明示的に使用してそれを実行したい場合は

var result= from m in MASTER 
      where m.Children.Count()==0// or m.Any() 
      select m; 

をLINQに参加あなたはこれを試すことができます。

var recs=from m in MASTER 
     join c in child on m.Id equals C.MasterId into gj 
     where gj.Count()==0 // or gj.Any() 
     select m; 
+0

このアプローチも好きですが、私はこの特定のプロジェクトでEFを使用していません。しかし、私は使用している他の人がいるので、私はこれらのプロジェクトでこのようにしています。ありがとう。 –

関連する問題