Как запросить, где хотя бы один элемент существует в списке? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь запросить список фильмов на основе поиска клиентов. Жанры - это список фильмов, поэтому фильмы могут иметь несколько жанров. При поиске клиенты могут выбирать, какие жанры они хотят найти, с помощью списка множественного выбора.

Моя проблема в том, что мой код запрашивает фильмы, где он содержит каждый выбранный жанр, а не запрашивает фильмы, где выбран хотя бы один из жанров. (пропущены другие аргументы и код запроса для экономии места)

public ActionResult DisplaySearchResults(int[] SelectedGenres) //selected genres from multiselect list
{
    List<Movie> SelectedMovies = new List<Movie>();
    SelectedMovies = db.Movies.ToList();
    var query = from r in db.Movies.Include("Genres")
                select r;

    if (SelectedGenres == null || SelectedGenres.Count() == 0) 
    {
        ViewBag.SelectedGenre = "No genre was selected";
    }
    else
    {
        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));
        }
    }

    SelectedMovies = query.ToList();
    return View("Index", SelectedMovies);
 }

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

через некоторое время проводим тестирование, вот что вам нужно:

 List<Movie> FilteredMovies = SelectedMovies.Where(x => x.Genres.Any(y=> SelectedGenres.Contains(y))).ToList();
0 голосов
/ 27 апреля 2018

Я думаю, что это должно делать то, что вы хотите. Я объединил часть вашей логики в запрос, чтобы продемонстрировать, как можно проверить, чтобы 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);
}
0 голосов
/ 27 апреля 2018

Я представляю, что ваша проблема (я не совсем уверен, в чем ваша проблема, но это то, что мне нравится) - в строках

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));
}

поскольку вы перезаписываете запрос результатами запроса. Где (). Возможно, что-то подобное будет работать вместо вас, поскольку вы будете сохранять результаты каждого запроса. Где () в ваш возвращенный список, а не перезаписывать запрос результатами запроса. Где ().

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());
}
...