我熟悉在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;
非常感谢协助:)
答案 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;