public async Task <IActionResult> ProductList(GridCommand command, ProductListModel model) { var gridModel = new GridModel <ProductOverviewModel>(); var fields = new List <string> { "name" }; if (_searchSettings.SearchFields.Contains("sku")) { fields.Add("sku"); } if (_searchSettings.SearchFields.Contains("shortdescription")) { fields.Add("shortdescription"); } var searchQuery = new CatalogSearchQuery(fields.ToArray(), model.SearchProductName) .HasStoreId(model.SearchStoreId) .WithCurrency(_workContext.WorkingCurrency) .WithLanguage(_workContext.WorkingLanguage); if (model.SearchIsPublished.HasValue) { searchQuery = searchQuery.PublishedOnly(model.SearchIsPublished.Value); } if (model.SearchHomePageProducts.HasValue) { searchQuery = searchQuery.HomePageProductsOnly(model.SearchHomePageProducts.Value); } if (model.SearchProductTypeId > 0) { searchQuery = searchQuery.IsProductType((ProductType)model.SearchProductTypeId); } if (model.SearchWithoutManufacturers.HasValue) { searchQuery = searchQuery.HasAnyManufacturer(!model.SearchWithoutManufacturers.Value); } else if (model.SearchManufacturerId != 0) { searchQuery = searchQuery.WithManufacturerIds(null, model.SearchManufacturerId); } if (model.SearchWithoutCategories.HasValue) { searchQuery = searchQuery.HasAnyCategory(!model.SearchWithoutCategories.Value); } else if (model.SearchCategoryId != 0) { searchQuery = searchQuery.WithCategoryIds(null, model.SearchCategoryId); } IPagedList <Product> products; if (_searchSettings.UseCatalogSearchInBackend) { searchQuery = searchQuery.Slice((command.Page - 1) * command.PageSize, command.PageSize); var sort = command.Sorting?.FirstOrDefault(); if (sort != null) { switch (sort.Member) { case nameof(ProductModel.Name): searchQuery = searchQuery.SortBy(sort.Descending ? ProductSortingEnum.NameDesc : ProductSortingEnum.NameAsc); break; case nameof(ProductModel.Price): searchQuery = searchQuery.SortBy(sort.Descending ? ProductSortingEnum.PriceDesc : ProductSortingEnum.PriceAsc); break; case nameof(ProductModel.CreatedOn): searchQuery = searchQuery.SortBy(sort.Descending ? ProductSortingEnum.CreatedOn : ProductSortingEnum.CreatedOnAsc); break; } } if (!searchQuery.Sorting.Any()) { searchQuery = searchQuery.SortBy(ProductSortingEnum.NameAsc); } var searchResult = await _catalogSearchService.SearchAsync(searchQuery); products = await searchResult.GetHitsAsync(); } else { var query = _catalogSearchService .PrepareQuery(searchQuery) .ApplyGridCommand(command, false); products = await new PagedList <Product>(query, command.Page - 1, command.PageSize).LoadAsync(); } var fileIds = products.AsEnumerable() .Select(x => x.MainPictureId ?? 0) .Where(x => x != 0) .Distinct() .ToArray(); var files = (await _mediaService.GetFilesByIdsAsync(fileIds)).ToDictionarySafe(x => x.Id); gridModel.Rows = products.AsEnumerable().Select(x => { var productModel = new ProductOverviewModel { Sku = x.Sku, Published = x.Published, ProductTypeLabelHint = x.ProductTypeLabelHint, Name = x.Name, Id = x.Id, StockQuantity = x.StockQuantity, Price = x.Price, LimitedToStores = x.LimitedToStores, EditUrl = Url.Action("Edit", "Product", new { id = x.Id }), ManufacturerPartNumber = x.ManufacturerPartNumber, Gtin = x.Gtin, MinStockQuantity = x.MinStockQuantity, OldPrice = x.OldPrice, AvailableStartDateTimeUtc = x.AvailableStartDateTimeUtc, AvailableEndDateTimeUtc = x.AvailableEndDateTimeUtc }; //MiniMapper.Map(x, productModel); files.TryGetValue(x.MainPictureId ?? 0, out var file); // TODO: (core) Use IImageModel productModel.PictureThumbnailUrl = _mediaService.GetUrl(file, _mediaSettings.CartThumbPictureSize); productModel.NoThumb = file == null; productModel.ProductTypeName = x.GetProductTypeLabel(_localizationService); productModel.UpdatedOn = _dateTimeHelper.ConvertToUserTime(x.UpdatedOnUtc, DateTimeKind.Utc); productModel.CreatedOn = _dateTimeHelper.ConvertToUserTime(x.CreatedOnUtc, DateTimeKind.Utc); return(productModel); }); gridModel.Total = products.TotalCount; return(Json(gridModel)); }