如何在linq中进行WHERE IN

时间:2010-10-26 18:03:38

标签: c# linq

所以我有一个Blog对象,其中包含一个标记对象列表(List<Tag>)。

我正在尝试创建一个获取标记列表的方法,并返回包含传入列表中所有标记的博客列表。

我能够制作一个方法,如果它匹配一个标签,但会返回一个博客列表,而不是标签列表。

这样做我有这个

entities.Blogs.Where(b => b.Tags.Any(t => t.Name == tagName))

但我无法弄清楚如何做这样的事情

entities.Blogs.Where(b => b.Tags.Any(t => t.Name == tags[0] AND t.Name == tags[1] AND t.Name == tags[2] etc.......))

有没有办法做到这一点?

谢谢!

我正在使用LINQ to Entities

2 个答案:

答案 0 :(得分:11)

从逻辑上讲,我认为你想要这样的东西:

entities.Blogs.Where(b => tags.All(t => b.Tags.Any(bt => bt.Name == t)))

可替换地:

HashSet<string> tagNames = new HashSet<string>(tags);
return entities.Blogs
               .Where(b => tagNames.IsSubsetOf(b.Tags.Select(x => x.Name)));

如果这是使用LINQ to Entities,我怀疑这会起作用 - 但是如果你只是使用LINQ to Objects它应该有效。即便如此,它也不会非常有效。我怀疑有一种更有效的做事方式,但我不能立即想到它......感觉你想要一个加入,但它再次变得棘手。

答案 1 :(得分:1)

您可以这样做:

List<Tag> tags = GetTags...;
IQueryable<Blog> blogs = entities.Blogs; // start with all
foreach(var tag in tags){
   var thisTag = tag;  //this is needed to prevent a bug
   blogs = blogs.Where(entry=>entry.Tags.Any(entryTag=>entryTag.TagId==thisTag.TagId));
}
return blogs.OrderBy....;

这将把Where子句链接在一起,要求返回博客条目的所有标签。