2011-07-31 2 views
2

Linq에서 SQL 로의 간단한 다 대다 관계 (즉, 단순 조인)에 익숙하지만 지금 당장 생각하고 있습니다.Linq to SQL - 다 대다 (many to many) 술어

나는 분류 체계를 나타내는 3 개의 테이블을 가지고있다. (그래서, 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; 

지원을 많이 감사합니다 :) 그냥 ProductTags 테이블을 시작하는 경우

답변

3

당신은 한 쿼리에서 그것을 할 수 있습니다. 여러 태그와 일치하는 중복 제품을 피하려면 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; 

또는

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; 
:

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

또는 여기에 다른 방법