public async Task <PaginationList <TouristRoute> > GetTouristRoutesAsync(TouristRouteFilterParameters filterParameters)
        {
            //IQueryable<TouristRoute> collectionBeforePaging =
            //    _context.TouristRoutes
            //    .Include(t => t.TouristRoutePictures);

            IQueryable <TouristRoute> collectionBeforePaging = _context.TouristRoutes
                                                               .Include(t => t.TouristRoutePictures)
                                                               .ApplySort(filterParameters.OrderBy, _propertyMappingService.GetPropertyMapping <TouristRouteDto, TouristRoute>());

            // filter keyword
            if (!string.IsNullOrEmpty(filterParameters.Keyword))
            {
                collectionBeforePaging = collectionBeforePaging.Where(c => c.Title.Contains(filterParameters.Keyword.Trim()));
            }
            // filter rating
            if (filterParameters.RatingValue != 0)
            {
                //switch (filterParameters.RatingOperator)
                //{
                //    case OperatorType.equal:
                //        result = result.Where(c => c.Rating == filterParameters.RatingValue);
                //        break;
                //    case OperatorType.lessThan:
                //        result = result.Where(c => c.Rating <= filterParameters.RatingValue);
                //        break;
                //    case OperatorType.largerThan:
                //    default:
                //        result = result.Where(c => c.Rating >= filterParameters.RatingValue);
                //        break;
                //}
                collectionBeforePaging = filterParameters.RatingOperator switch
                {
                    OperatorType.equal => collectionBeforePaging.Where(c => c.Rating == filterParameters.RatingValue),
                    OperatorType.lessThan => collectionBeforePaging.Where(c => c.Rating <= filterParameters.RatingValue),
                    _ => collectionBeforePaging.Where(c => c.Rating >= filterParameters.RatingValue),
                };
            }

            // pagination
            //var count = result.Count();
            //var skip = (filterParameters.PageNumber - 1) * filterParameters.PageSize;
            //result = result.Skip(skip);
            //var display = Math.Min(count - skip, filterParameters.PageSize);
            //if (display > 0)
            //{
            //    result = result.Take(display);
            //}
            //return result.ToList();
            return(await PaginationList <TouristRoute> .Create(
                       collectionBeforePaging,
                       filterParameters.PageNumber,
                       filterParameters.PageSize
                       ));
        }
 private string CreateAuthorsResourceUri(
     TouristRouteFilterParameters parameters,
     ResourceUriType type
     )
 {
     return(type switch
     {
         ResourceUriType.PreviousPage => _urlHelper.Link("GetTouristRoutes",
                                                         new
         {
             keyword = parameters.Keyword,
             rating = parameters.Rating,
             pageNumber = parameters.PageNumber - 1,
             pageSize = parameters.PageSize,
             orderBy = parameters.OrderBy,
             fields = parameters.Fields,
         }),
         ResourceUriType.NextPage => _urlHelper.Link("GetTouristRoutes",
                                                     new
         {
             keyword = parameters.Keyword,
             rating = parameters.Rating,
             pageNumber = parameters.PageNumber + 1,
             pageSize = parameters.PageSize,
             orderBy = parameters.OrderBy,
             fields = parameters.Fields,
         }),
         _ => _urlHelper.Link("GetTouristRoutes",
                              new
         {
             keyword = parameters.Keyword,
             rating = parameters.Rating,
             pageNumber = parameters.PageNumber,
             pageSize = parameters.PageSize,
             orderBy = parameters.OrderBy,
             fields = parameters.Fields,
         })
     });