我有两个SQL表:Movies
和Tags
,而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 };
....
}
答案 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
实例而不是字符串:
Equals
上覆盖了Tag
类似的东西:
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()
ID
是Tag
表的主键。