2011-07-31 15 views
2

私はLinq to SQLの簡単な多対多関係(つまり単純結合)に精通していますが、今は思っています。Linq to SQL - 多対多述語

私は、分類システムを表す3つのテーブル(Linq-SQLモデル内のエンティティ)を持っています。本当に標準問題:

製品 - 製品タグ - タグ

私は、彼らがしているタグがクエリに合致する製品のセットを返すメソッドを書いています。したがって、誰かが "foo"を検索した場合、タグ "foobar"または "fooqux"(ただし "bazbar"ではなく)で割り当てられたすべての商品が返されます。

私はクエリを2つの部分に構造化しなければならないことは知っています。最初に一致するタグを取得し、次にそれらのタグを持つ製品を取得する必要があります。それは私が困惑した第二の部分です。

は、ここで私はこれまで持っているものです:

var tags = from t in db.Tags 
      where t.Name.Contains(tagSearchQuery) 
      select t; 

var products = from p in db.Products 
       // then a miracle happens 
       select p; 

支援に感謝:)あなただけのProductTagsテーブルで始まる場合

答えて

3

あなたは1つのクエリでそれを行うことができます。複数のタグに一致する商品が重複しないようにするには、おそらくDistinctが必要です。

var products = (from pt in db.ProductTags 
       where pt.Tag.Name.Contains(tagSearchQuery) 
       select pt.Product).Distinct(); 

またはここに別の方法です:

var products = from p in db.Products 
        from pt in p.ProductTags 
        where pt.Tag.Name.Contains(tagSearchQuery) 
        select p 
0
IQueryable<Tag> tags = 
    from t in db.Tags 
    where t.Name.Contains(tagSearchQuery) 
    select t; 

IQueryable<Product> products = 
    from p in db.Products 
    where p.ProductTags.Any(pt => tags.Contains(pt.Tag)) 
    select p; 

OR

IQueryable<Product> products = 
    from p in db.Products 
    from pt in p.ProductTags 
    let t = pt.Tag 
    where t.Name.Contains(tagSearchFragment) 
    group t by p into g 
    select g.Key;