0

代替テキスト
このdbモデルに基づいて 、LINQを使用して次のエンティティデータモデルをクエリしようとしています 代替テキスト

ProductFacets.FacetTypeId に基づいて製品のリストを取得できるようにしたいと考えています。

通常、私は結合を使用しますが、これは問題になりませんが、Entity DataModel の下で多対多のテーブルをクエリする方法がよくわかりません。

これは、SQL クエリの例です。

select p.Name, pf.FacetTypeId from Products p
inner join ProductFacets pf on p.ProductId = pf.ProductId   
where pf.FacetTypeId in(8, 12)
4

2 に答える 2

1

EF 4 の場合:

var facetIds = new [] { 8, 12 };
var q = from p in Context.Products
        where p.FacetTypes.Any(f => facetIds.Contains(f.FacetTypeId))
        select p;
于 2010-07-21T13:36:30.447 に答える
1

EF では (マッピングが正しく行われていると仮定して)、結合はほとんど使用されません。代わりにナビゲーション プロパティが使用されます。

元の SQL は、Name エントリが繰り返されるタプルを返します。LINQ を使用すると、多くの場合、クエリをタプル以外の結果に "整形" する方が簡単です。

以下は SQL と同じである必要がありますが、名前が繰り返される (Name, FacetTypeId) ペアを返す代わりに、Name と一連の FacetTypeIds を持つ型を返します。

var facetIds = new [] { 8, 12 };
var result = from p in db.Products
             select new
             {
                p.Name,
                FacetTypeIds = from pf in p.FacetTypes
                               where pf.FacetTypeId == 8 || pf.FacetTypeId == 12
                               select pf.FacetTypeId,
             };
于 2010-07-21T13:39:29.813 に答える