public static GetProductsByCategoryResponse CreateProductSearchResultFrom(
     this IEnumerable<Product> productsMatchingRefinement,
     GetProductsByCategoryRequest request)
 {
     var productSearchResultView =
         new GetProductsByCategoryResponse();
     var productsFound =
         productsMatchingRefinement.Select(p => p.ProductTitle).Distinct();
     productSearchResultView.SelectedCategory = request.CategoryId;
     productSearchResultView.NumberOfTitlesFound = productsFound.Count();
     productSearchResultView.TotalNumberOfPages =
         NoOfResultPagesGiven(request.NumberOfResultsPerPage,
                              productSearchResultView.NumberOfTitlesFound);
     productSearchResultView.RefinementGroups = GenerateAvailableProductRefinementsFrom(productsFound);
     productSearchResultView.Products =
         CropProductListToSatisfyGivenIndex(request.Index,
                                            request.NumberOfResultsPerPage, productsFound);
     return productSearchResultView;
 }
        public GetProductsByCategoryResponse GetProductsByCategory(GetProductsByCategoryRequest request)
        {
            if (request == null) throw new ArgumentNullException("request");

            var response = new GetProductsByCategoryResponse();

            var specification =
                new DirectSpecification<Product>(product => product.ProductTitle.Category.Id == request.CategoryId);

            switch (request.SortBy)
            {
                case ProductsSortBy.PriceHighToLow:
                    {
                        response =
                            _productRepository.GetBySpec(specification).OrderByDescending(p => p.ProductTitle.Price).
                                CreateProductSearchResultFrom(request);
                        break;
                    }
                case ProductsSortBy.PriceLowToHigh:
                    {
                        response =
                            _productRepository.GetBySpec(specification).OrderBy(p => p.ProductTitle.Price).
                                CreateProductSearchResultFrom(request);
                        break;
                    }
            }

            var singleCategory =
                _categoryRepository.GetBySpec(
                    new DirectSpecification<Category>(category => category.Id == request.CategoryId)).SingleOrDefault();

            if (singleCategory != null)
                response.SelectedCategoryName = singleCategory.Name;

            return response;
        }