private IQueryable <Ad> Search(string keywordSearch, Guid[] categories, OrderSearchAd order, double maxPrice, double minPrice, int pageSize, int page)
        {
            var specification = SpecificationAdQueryBuilder.MinPrice(minPrice);

            specification = maxPrice > 0 ? specification.MaxPrice(maxPrice) : specification;
            specification = !string.IsNullOrEmpty(keywordSearch) ? specification.WithKeywordInTitle(keywordSearch) : specification;
            specification = categories?.Length > 0 ? specification.WithCategory(categories) : specification;

            var result = _adService.Search(specification);

            switch (order)
            {
            case OrderSearchAd.Publish: result = result.OrderBy(c => c.Date); break;

            case OrderSearchAd.MaxPrice: result = result.OrderByDescending(c => c.Price); break;

            case OrderSearchAd.MinPrice: result = result.OrderBy(c => c.Price); break;
            }

            return(result
                   .Skip(pageSize * ((page > 0 ? page : 1) - 1))
                   .Take(pageSize));
        }
 public async Task <IEnumerable <Ad> > SearchAdsAsync(string keywordSearch, Guid[] categories = default(Guid[]), OrderSearchAd order = OrderSearchAd.Publish, double maxPrice = 0, double minPrice = 0, int pageSize = 20, int page = 1)
 {
     return(await Search(keywordSearch, categories, order, maxPrice, minPrice, pageSize, page).ToListAsync(CancellationToken));
 }
 public IEnumerable <Ad> SearchAds(string keywordSearch, Guid[] categories = default(Guid[]), OrderSearchAd order = OrderSearchAd.Publish, double maxPrice = 0, double minPrice = 0, int pageSize = 20, int page = 1)
 {
     return(Search(keywordSearch, categories, order, maxPrice, minPrice, pageSize, page).ToList());
 }