Metoda zwracająca wyniki wyszukiwania

0

Cześć
Chcę na swojej stronie zrobić filtrowanie produktów i ich wyświetlanie.

Mam akcję kontrolera Search, do którego przekazuje wypełniony kryteriami wyszukiwania view model, a następnie przekazuję go do metody serwisu, która zwraca mi nowy view model (zaktualizowany o wyniki wyszukiwania) i wysyłam do widoku.

[HttpGet]
public virtual ActionResult Search(ProductSearchViewModel searchViewModel)
{
       var viewModel = productService.GetProductSearchViewModel(searchViewModel);
       return View(viewModel);
}
public class ProductSearchViewModel
    {
        public string Name { get; set; }
        public List<int> Manufacturer { get; set; }
        public int Category { get; set; }
        public decimal PriceFrom { get; set; }
        public decimal PriceTo { get; set; }
        public int Rating { get; set; }

        public int Page { get; set; }
        public int PageSize { get; set; }
        public int TotalPages { get; set; }
        public string Mode { get; set; }

        public Dictionary<string, int> AvaibleManufacturers { get; set; }
        public List<ProductViewModel> Products { get; set; }

        public ProductSearchViewModel()
        {
            Manufacturer = new List<int>();
            AvaibleManufacturers = new Dictionary<string, int>();
            Products = new List<ProductViewModel>();
        }
    }

Metoda serwisu, która zwraca view model (dla kontrolera)

  public ProductSearchViewModel GetProductSearchViewModel(ProductSearchViewModel viewModel, int pageSize = 6, int page = 1, string sort = "")
{
      var searchCriteria = Mapper.Map<SearchCriteria>(viewModel);   

      var products = GetProducts(searchCriteria, sort);         
      var totalPages = GetTotalPages(products, pageSize);     
      var manufacturers = context.Products.Where(x => x.CategoryId == searchCriteria.Category)
                .Select(x => x.Manufacturer).Distinct();              

       viewModel = new ProductSearchViewModel()
       {
                TotalPages = totalPages,
                Page = page,
                PageSize = pageSize,
                Manufacturer = searchCriteria.Manufacturer,
                Category = searchCriteria.Category,
        };

            foreach (var item in products)
                viewModel.Products.Add(Mapper.Map<ProductViewModel>(item));         

            foreach (var item in manufacturers)
                viewModel.AvaibleManufacturers.Add(item.Name, item.Id);               

            return viewModel;

}
public List<Product> GetProducts(SearchCriteria search, string sort)
{
     var products = context.Products.Where(x => x.CategoryId == search.Category).AsEnumerable();
     products = FilterProducts(products, search);
     products = SortProducts(products, sort);

     return products.ToList();
}

Czy ktoś mógłby rzucić okiem i powiedzieć, czy odpowiednio się do tego zabieram?

1
  1. Filtrowanie i sortowanie powinieneś wykonywać na IQueryable, żeby zrzucić to na bazę danych. W tym momencie za każdym razem pobierasz wszystkie produkty z danej kategorii i dopiero filtrujesz. Baza danych jest pod to bardziej zoptymalizowana :)
  2. Skoro już używasz AutoMappera to możesz zrobić projekcję za pomocą metody rozszerzającej ProjectTo, wtedy od bazy dostaniesz tylko te dane, które są potrzebne w viewmodelu, więc jeśli tabela ma 100 kolumn, a w widoku jest tylko 10 to 90 nie będzie przesyłane niepotrzebnie ;)
  3. Ja bym zrobił osobny viewmodel dla kryteriów wyszukiwania które wysyłasz z przeglądarki i osobny dla wyświetlanych danych. Ewentualnie jeśli na stronie ponownie wyświetlasz zawartość wszystkich przesłanych pól to możesz umieścić viewmodel z kryteriami jako właściwość viewmodelu całej strony.
0

Nie powinieneś używać tej samej klasy na wejściu i wyjściu, tak samo jak nie odżywiasz się w ten sposób.

1 użytkowników online, w tym zalogowanych: 0, gości: 1