0

多対多の関係の製品(p)と材質(m)と製品2材質表(p2m)は多対多の関係にありますリンク。LINQエンティティフレームワークを使用した多対多での完全な外部結合

は、私は基本的に

- all products that have materials assigned, 
- all products with no materials assigned, 
- and all materials with no products assigned. 

そこにあるものの労働組合を取得する必要があります。 これはデータフィルタになるため、検索条件に一致しない商品や素材(たとえば、「A」で始まる商品など)を除外する必要があります。

これはLINQ-to-EF 4.1でどのように行うのですか?

多くの感謝!

+0

この時点での、および完全外部LINQに参加するので、頭痛のようです私はLINQクエリを実行するビューについて考えています。ビューには必要なJOINSが既に用意されており、LINQの照会ははるかに簡単になります。 – John

答えて

0

Linqは完全な外部結合操作を直接提供していないので、左と右のL2Eクエリを分離し、それらを単一の結果セットに結合することをお勧めします。

私は(テストしていません)のような何かしようとするだろう:

var query = (from p in context.Products 
      from m in p.Materials 
      select new { p, m }) 
      .Union(
      from m in context.Materials 
      from p in m.Products 
      select new { p, m }) 
      ... 

おそらく、あなたは、外部結合を強制するDefaultIfEmptyを使用する必要がありますが。

います[はいたフィールドを行う場合に必要(単一のIQueryableとしてそれを必要とする

  1. すべての製品
  2. すべての未使用素材:

0

はあなたの説明から、それはあなたが実際に必要とするようになります。 )または2つのIQueryablesとして?それはおそらく、次の方が良いだろうパフォーマンスを実現するため

from m in context.Materials //m has to be the first 
from p in context.Products  
where !p.Select(p1 => p1.Material).Contains(m) || p.Material == null || p.Material == m 

+0

まあ、私は本当にすべての製品、はい、すべての材料が、ユーザーが何を望むかに応じて必要です。ユーザは、製品に関連付けられた素材、またはまだ関連付けられていない素材を希望するかどうかを選択できます。 – John

0

次は仕事をすべき

var a = from p in context.Products select p.Material; 

var b = from m in context.Materials //m has to be the first 
     from p in context.Products  
     where a.Contains(m) || p.Material == null || p.Material == m 
関連する問題