public async Task <JsonResult> Filter(HomeSearchBindingModel model) { var cacheKey = KeyGenerator.Generate( WebConstants.CacheHomeFilterPrepend, model.SelectedCarType.ToString(), model.SelectedModelType, model.SelectedPriceRange, model.SelectedYear); var cachedModel = await this.cacheService.GetOrDefaultAsync <HomeSearchBindingModel>(cacheKey); if (cachedModel != null) { return(Json(cachedModel)); } var priceRanges = ParameterParser.ParsePriceRange(model.SelectedPriceRange); var filterStrategies = CarFilterStrategyFactory .GetStrategies(model.SelectedYear, priceRanges[0], priceRanges[1], WebConstants.AllFilterTypeModelValue); var mutipleFilterStrategy = CarMultipleFilterStrategyFactory.GetStrategy(new string[] { model.SelectedModelType }); var filteredCars = this.carsService.GetFiltered <BaseCar>(filterStrategies.ToArray()); filteredCars = mutipleFilterStrategy.Filter(filteredCars); var searchModel = await this.homeService.GetSearchModelAsync(filteredCars, model.SelectedCarType); _ = this.cacheService.AddInfinityCacheAsync(searchModel, cacheKey, WebConstants.CacheCarsType); return(Json(searchModel)); }