public async Task <PagedCollection <GetGameDto> > GetPagedListAsync(GameFilterParamsDto filterParams, CancellationToken ct = default)
        {
            Logger.LogInformation("Game games by filter params {FilterParams}", filterParams);

            GameFilterParams dbFilterParams = Mapper.Map <GameFilterParams>(filterParams);

            PagedCollection <GameBase> dbGames =
                await UnitOfWork.GameRepository.GetByFilterParamsAsync(dbFilterParams, ct);

            return(new PagedCollection <GetGameDto>(Mapper.Map <ICollection <GetGameDto> >(dbGames.Items).ToImmutableList(), dbGames.TotalCount));
        }
        public async Task <PagedCollection <Game> > GetByFilterParamsAsync(GameFilterParams filterParams, CancellationToken ct)
        {
            var query = DbSet.AsNoTracking();

            SortGames(filterParams.SortingType, query);

            query = GetPagedQuery(query, filterParams, out int totalCount);

            var result = await query.ToListAsync(ct);

            return(new PagedCollection <Game>(result, totalCount));
        }
        public async Task <PagedCollection <GameBase> > GetByFilterParamsAsync(GameFilterParams filterParams, CancellationToken ct)
        {
            var query = GetGames();

            FillGamesQueryFilterParams(filterParams);
            query = FillSortParams(query, filterParams);

            int totalCount = query.Count();

            var games = await query
                        .Skip(filterParams.PageSize *(filterParams.PageNumber - 1))
                        .Take(filterParams.PageSize)
                        .AsNoTracking()
                        .ToListAsync(ct);

            PagedCollection <GameBase> result = new PagedCollection <GameBase>(games.ToImmutableList(), totalCount);

            return(result);
        }
        private static void FillGamesQueryFilterParams(GameFilterParams filterParams)
        {
            var predicate = PredicateBuilder.New <GameBase>(x => !x.IsDeleted);

            if (filterParams.GenreIds != null && filterParams.GenreIds.Any())
            {
                predicate = predicate.Extend(p => filterParams.GenreIds.Contains(p.GenreId), PredicateOperator.And);
            }

            if (!string.IsNullOrEmpty(filterParams.Term))
            {
                predicate = predicate.Extend(
                    x => EF.Functions.Like(x.GameDetails.Name, $"%{filterParams.Term}%"), PredicateOperator.And);
            }

            if (filterParams.StartPrice.HasValue && filterParams.EndPrice.HasValue)
            {
                predicate = predicate.Extend(
                    x => filterParams.StartPrice <= x.GameDetails.Price &&
                    filterParams.EndPrice >= x.GameDetails.Price, PredicateOperator.And);
            }

            filterParams.Expression = predicate;
        }
        private static IQueryable <GameBase> FillSortParams(IQueryable <GameBase> query, GameFilterParams filterParams)
        {
            query = query.Where(filterParams.Expression);

            switch (filterParams.SortMode)
            {
            case GameSortMode.ByName:
                query = query.OrderBy(x => x.GameDetails.Name).AsQueryable();
                break;

            case GameSortMode.ByCountOfSales:
                query = query.OrderByDescending(x => x.GameDetails.OrderCount).AsQueryable();
                break;

            case GameSortMode.ByRating:
                query = query.OrderByDescending(x => x.GameDetails.AverageRating).AsQueryable();
                break;

            case GameSortMode.ByPriceHighToLow:
                query = query.OrderByDescending(x => x.GameDetails.Price).AsQueryable();
                break;

            case GameSortMode.ByPriceLowToHigh:
                query = query.OrderBy(x => x.GameDetails.Price).AsQueryable();
                break;
            }

            return(query);
        }