Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq到SQL-多对多谓词_Linq_Linq To Sql_Many To Many - Fatal编程技术网

Linq到SQL-多对多谓词

Linq到SQL-多对多谓词,linq,linq-to-sql,many-to-many,Linq,Linq To Sql,Many To Many,我熟悉在LINQtoSQL中处理简单的多对多关系(即简单连接),但我现在很难思考 我有三个表(以及Linq到SQL模型中的实体)代表一个分类系统。标准问题: 产品-产品标签-标签 我正在编写一个方法,返回一组产品,其中它们所在的标记与查询匹配。所以,若有人搜索“foo”,那个么所有分配了标签“foobar”或“fooqux”(但不是“bazbar”)的产品都会被返回 我知道我必须将查询分为两部分:首先获取匹配的标记,然后获取具有这些标记的产品。这是我被难住的第二部分 以下是到目前为止我得到的信息

我熟悉在LINQtoSQL中处理简单的多对多关系(即简单连接),但我现在很难思考

我有三个表(以及Linq到SQL模型中的实体)代表一个分类系统。标准问题:

产品-产品标签-标签

我正在编写一个方法,返回一组产品,其中它们所在的标记与查询匹配。所以,若有人搜索“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
表开始,就可以在一个查询中完成。您可能还需要一个
独特的
,以避免重复的产品匹配多个标签

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
IQueryable标记=
从t到db.Tags
其中t.Name.Contains(tagSearchQuery)
选择t;
易液化产品=
从p到db.乘积
其中p.ProductTags.Any(pt=>tags.Contains(pt.Tag))
选择p;

IQueryable产品=
从p到db.乘积
来自p.ProductTags中的pt
设t=pt.Tag
其中t.Name.Contains(tagSearchFragment)
将t按p分组为g
选择g键;
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;