如何在多对多关系中搜索值数组?

时间:2009-07-10 16:48:45

标签: c# linq-to-entities many-to-many

我的LINQ to Entity模型有很多问题需要关联。我是C#和LINQ的新手,所以请耐心等待。

我有一个包含图片和标签的模型,每张图片可以有很多标签,每个标签可以放在很多图片上。在db中有一个普通的关系表,但在对象模型中我将其视为picture.tags(作为列表)和tag.pictures(作为列表)。搜索查询包含多个标记,搜索结果将包含所有标记有我搜索过的所有标记(但可能更多)的图片。要搜索的标签数量不固定。

如何才能做到最好?

3 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。这是一种方式。我不会声称它是“最好的”,但它会起作用。

IQueryable<Picture> FindByTags(IEnumerable<string> tags)
{
    var q = Context.Pictures;
    foreach (var tag in tags) 
    {
        q = q.Where(p => p.Tags.Any(t => t.Name == tag));
    }
    return q;
}

答案 1 :(得分:0)

嗯'。

我似乎无法让第二条线工作,即Contex.Pictures。上下文不允许它。据我所知,这个算法会添加所有匹配至少一个标签的图片,而不仅仅是匹配所有标签的图片?或者我错了吗?

答案 2 :(得分:0)

IQueryable<Picture> FindByTags(IEnumerable<string> included, IEnumerable<string> excluded)
{
      return (from p in context.Pictures
              where (from item in p.Tags
                     where included.Contains(item.Tag)
                     select 1).Count() == included.Count()
              where (from item in p.Tags
                     where excluded.Contains(item.Tag)
                     select 1).Count() == 0
              select p);
}

这也允许排除,如果你不想要,只需取出第二个。这仅适用于图片没有重复标签的情况