示例#1
0
        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));
        }
    }