LINQ - 列表包含另一个列表的元素

时间:2014-05-06 13:30:24

标签: linq entity-framework where-clause

我有两个SQL表:MoviesTags,而Movies包含List<Tag>

现在我想找到至少有一个List<Tag>参数标签的电影。我怎么能在LINQ中做到这一点?

public IEnumerable<Group<Genre, Movie>> GetMoviesGrouped(string search, List<Tag> tags)
{
    var movies = from movie in Movies
    where ( movie.Name.Contains(search)) && movie.Tags.???contains any element of tags???
    group movie by movie.genre into g
    select new Group<Genre, Movie> { Key = g.Key, Values = g };
....
}

2 个答案:

答案 0 :(得分:3)

tags中包含任何代码的电影:

var movies = from movie in Movies
             where ( movie.Name.Contains(search)) 
                  && movie.Tags.Any(t => tags.Contains(t))
             group movie by movie.genre into g
             select new Group<Genre, Movie> { Key = g.Key, Values = g };

但是,因为这是比较Tag实例而不是字符串:

  1. 它可能不会被转换为SQL(这意味着你必须保持查询并在Linq-to-Objects中进行额外的过滤),并且
  2. 您可能希望比较代码的数据而非实例(除非您在Equals上覆盖了Tag
  3. 类似的东西:

    where movie.Tags.Any(mt => tags.Any(t => t.ID == mt.ID))   // or whatever property(ies) of `Tag` defines equality
    

答案 1 :(得分:2)

您可以将两个列表相交,并查看是否有任何元素:

&& movie.Tags.Intersect(tags).Any()

由于Tag是一个对象,它将比较引用。相反,您可以从Tag中选择唯一标识符,然后将其与之相交:

&& movie.Tags.Select(r=> r.ID).Intersect(tags.Select(t=> t.ID)).Any()

IDTag表的主键。