如何查询列表中至少存在一个元素的位置?

时间:2018-04-27 19:39:41

标签: c# list listbox

我试图根据客户搜索查询电影列表。类型是电影中的列表,这意味着电影可以有多种类型。搜索时,客户可以通过多选列表选择他们想要查找的类型。

我的问题是我的代码正在查询包含所选类型的电影,而不是查询至少选择了其中一种类型的电影。 (省略其他参数和查询代码以节省空间)

foo

3 个答案:

答案 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)

我认为这应该做你想要的。我已将您的一些逻辑组合到查询中,以演示如何在查询本身中测试selectedGenresnull或为空。

基本上它说,选择以下其中一项为真的所有电影(和包括类型):

  • selectedGenresnull
  • 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();