我试图根据客户搜索查询电影列表。类型是电影中的列表,这意味着电影可以有多种类型。搜索时,客户可以通过多选列表选择他们想要查找的类型。
我的问题是我的代码正在查询包含所选类型的电影,而不是查询至少选择了其中一种类型的电影。 (省略其他参数和查询代码以节省空间)
foo
答案 0 :(得分:2)
我想你的问题(我不完全确定你的问题是什么,但这是对我来说很明显)是在行中
foreach (int GenreID in SelectedGenres)
{
//need to query where there's at least one genre, not all
//EX.Western and Horror selected should return movies that have either western or horror as a genre, not both.
query = query.Where(r => r.Genres.Any(x => x.GenreID == GenreID));
}
因为你用query.Where()的结果覆盖了查询。也许这样的事情对你有用,因为你将把每个query.Where()的结果保存到你的返回列表而不是用query.Where()的结果覆盖查询。
foreach (int GenreID in SelectedGenres)
{
//saving the results of each query.Where call to the SelectedMovies List
SelectedMovies.AddRange(query.Where(r => r.Genres.Any(x => x.GenreID == GenreID)).ToList());
}
答案 1 :(得分:1)
我认为这应该做你想要的。我已将您的一些逻辑组合到查询中,以演示如何在查询本身中测试selectedGenres
为null
或为空。
基本上它说,选择以下其中一项为真的所有电影(和包括类型):
selectedGenres
是null
selectedGenres
为空selectedGenres
列表中至少包含一部电影GenreIDs
列表中的Genres
以下是代码:
public ActionResult DisplaySearchResults(int[] selectedGenres)
{
var filteredMovies = db.Movies.Include("Genres")
.Where(movie => selectedGenres == null ||
!selectedGenres.Any() ||
movie.Genres.Any(genre => selectedGenres.Contains(genre.GenreID)))
.ToList();
return View("Index", filteredMovies);
}
答案 2 :(得分:0)
经过一段时间的测试,这就是你需要的:
List<Movie> FilteredMovies = SelectedMovies.Where(x => x.Genres.Any(y=> SelectedGenres.Contains(y))).ToList();