Linq to SQL - 多对多的谓词

时间:2011-07-31 16:06:53

标签: linq linq-to-sql many-to-many

我熟悉在Linq to SQL中进行简单的多对多关系(即简单连接),但我现在很难思考。

我有三个表(我的Linq-to-SQL模型中的实体)代表一个分类系统。真正的标准问题:

产品 - 产品标签 - 标签

我正在编写一个返回一组Products的方法,其中Tag所在的Tag与查询匹配。因此,如果有人搜索“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;

非常感谢协助:)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;