2011-07-31 90 views
2

我很熟悉在Linq to SQL中執行簡單的多對多關係(即簡單連接),但我現在很難考慮。Linq to SQL - 多對多謂詞

我有三個表(以及我的Linq-to-SQL模型中的實體)表示分類系統。標準問題真的:

產品 - ProductTags - 標籤

我正在寫返回一組產品,他們所在的標籤的查詢相匹配的方法。因此,如果有人搜索「foo」,則將返回所有分配了「foobar」或「fooqux」(但不是「bazbar」)標籤的產品。

我知道我必須將查詢結構分爲兩部分:首先獲取匹配的標籤,然後獲取具有這些標籤的產品。這是我難住的第二部分。

這裏是我到目前爲止有:

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; 

援助非常感謝:)

回答

3

你能做到在一個查詢,如果你只是用ProductTags表開始。您可能還需要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;