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)); }
private IQueryable <Product> GetProductQuery( int[] providerManus, int[] providerStores, int[] consumerManus, int categoryId = 0, DateTime?updatedOnUtc = null) { Guard.NotNull(providerManus, nameof(providerManus)); Guard.NotNull(providerStores, nameof(providerStores)); Guard.NotNull(consumerManus, nameof(consumerManus)); List <int> manuIds = null; List <int> storeIds = null; if (providerStores.Any()) { storeIds = providerStores.Where(x => x != 0).ToList(); } if (providerManus.Any()) { manuIds = new List <int>(); foreach (var id in providerManus.Where(x => x != 0)) { if (!consumerManus.Any() || consumerManus.Contains(id)) { manuIds.Add(id); } } } else { manuIds = consumerManus.Where(x => x != 0).ToList(); } var searchQuery = new CatalogSearchQuery(); if (!_shopConnectorSettings.IncludeHiddenProducts) { searchQuery = searchQuery.PublishedOnly(true); } var query = _catalogSearchService.Value.PrepareQuery(searchQuery); if (updatedOnUtc.HasValue) { query = query.Where(x => x.UpdatedOnUtc > updatedOnUtc); } if (storeIds != null && storeIds.Any()) { query = from p in query join sm in _storeMappingRepository.Value.TableUntracked on new { pid = p.Id, pname = "Product" } equals new { pid = sm.EntityId, pname = sm.EntityName } into psm from sm in psm.DefaultIfEmpty() where !p.LimitedToStores || storeIds.Contains(sm.StoreId) select p; } if (manuIds != null && manuIds.Any()) { query = from p in query from pm in p.ProductManufacturers.Where(pm => manuIds.Contains(pm.ManufacturerId)) select p; //var distinctIds = ( // from p in query // join pm in _productManufacturerRepository.Value.TableUntracked on p.Id equals pm.ProductId // where manuIds.Contains(pm.ManufacturerId) // select p.Id).Distinct(); //query = // from p in query // join x in distinctIds on p.Id equals x // select p; } if (categoryId != 0) { query = from p in query from pc in p.ProductCategories.Where(pc => pc.CategoryId == categoryId) select p; //var distinctIds = ( // from p in query // join pc in _productCategoryRepository.Value.TableUntracked on p.Id equals pc.ProductId // where pc.CategoryId == categoryId // select p.Id).Distinct(); //query = // from p in query // join x in distinctIds on p.Id equals x // select p; } return(query); }