public IActionResult SortAndFilter(string[] genresIds, string[] featuresIds, string[] pricesIds, string[] sortsIds, string searchStr) { searchStr = searchStr is null ? "" : searchStr; if (!string.IsNullOrEmpty(searchStr)) { ViewBag.isRedirectedFromOtherPageBySearchBtn = true; } IEnumerable <Game> foundGames = gamesTable.SearchGames(searchStr); // construct all filters by data received from page GameFilter?filter = new GameFilter { Genres = genresIds.Select(id => genresTable.GetGenreByUrlId(id)).ToList() !, Features = featuresIds.Select(id => featuresTable.GetFeatureByUrlId(id)).ToList() ! }; if (filter.Genres.Count == 0 && filter.Features.Count == 0) { filter = null; } // construct all categories by data received from page List <PriceCategory> categories = pricesIds.Select( id => priceCategoriesTable.GetCategoryByUrlId(id) ).ToList() !; // get sort type by data received from page SortingTypes sortType = HomeViewModel.SortingItems[sortsIds[0]].Value; // get filtered and sorted games IEnumerable <Game> filteredAndSortedGames = gamesTable .GetGamesByFilter(filter !, categories) .SortBy(sortType); IEnumerable <Game> result; // to avaoid multiple enumeration IEnumerable <Game> foundAsList = foundGames as Game[] ?? foundGames.ToArray(); IEnumerable <Game> filteredAndSortedAsList = filteredAndSortedGames as Game[] ?? filteredAndSortedGames.ToArray(); // find intersection between found games and filtered games result = filteredAndSortedAsList.Where( g => foundAsList.FirstOrDefault(fg => fg.Id == g.Id) != null ); IEnumerable <GameCard> gameCards = CreateGameCards(result); return(PartialView("_GamesListPartial", gameCards)); } }