// GET: products/
        // GET: products/index
        // GET: products/index?minPrice=25&sortOrder=PriceHighToLow
        public IActionResult Index(ProductFilter filter, ProductSortOrder sortOrder = ProductSortOrder.Default)
        {
            IList <Product> products = productDAO.GetAll(filter, sortOrder);

            //ViewData["Products"] = products;
            return(View(products));
        }
예제 #2
0
        /// <summary>
        /// 排序
        /// </summary>
        /// <param name="sort"></param>
        /// <returns></returns>
        private static Func<IQueryable<ProductEntity>, IOrderedQueryable<ProductEntity>> GetOrder(ProductSortOrder sort)
        {
            Func<IQueryable<ProductEntity>, IOrderedQueryable<ProductEntity>> order;
            switch (sort)
            {
                case ProductSortOrder.Default:
                default:
                    order = v => v.OrderByDescending(s => s.SortOrder).ThenByDescending(s => s.CreatedDate);
                    break;
            }

            return order;
        }
예제 #3
0
        public IList <Product> GetAll(ProductFilter filter, ProductSortOrder sortOrder)
        {
            List <Product> products = new List <Product>();

            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    SqlCommand command = new SqlCommand();

                    //string sql = $"SELECT products.* FROM products " +
                    //    $"JOIN categories ON products.category_id = categories.id " +
                    //    $"WHERE (price BETWEEN {filter.MinPrice} AND {filter.MaxPrice}) " +
                    //    $"AND (average_rating >= {filter.MinRating}) ";

                    string sql = $"SELECT products.* FROM products " +
                                 $"JOIN categories ON products.category_id = categories.id " +
                                 $"WHERE (price BETWEEN @MinPrice AND @MaxPrice) " +
                                 $"AND (average_rating >= @MinRating) ";

                    command.Parameters.AddWithValue("@MinPrice", filter.MinPrice);
                    command.Parameters.AddWithValue("@MaxPrice", filter.MaxPrice);
                    command.Parameters.AddWithValue("@MinRating", filter.MinRating);

                    if (!String.IsNullOrEmpty(filter.Category))
                    {
                        sql += $"AND (categories.name = @category)";
                        command.Parameters.AddWithValue("@category", filter.Category);
                    }

                    sql += $" ORDER BY {SortChoices[sortOrder]};";

                    command.CommandText = sql;
                    command.Connection  = connection;
                    SqlDataReader reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        products.Add(MapRowToProduct(reader));
                    }
                }
            }
            catch (SqlException ex)
            {
                Console.Error.WriteLine($"Exception occurred reading product data - ${ex}");
                throw;
            }

            return(products);
        }
예제 #4
0
        public IQueryable <ProductEntity> Get(PagerRequest pagerRequest, out int totalCount, ProductSortOrder sortOrder, ProductFilter productFilter)
        {
            var linq = base.Get(Filter(productFilter));

            //var linq = base.Get(Filter(productFilter), out totalCount, pagerRequest.PageIndex, pagerRequest.PageSize,
            //                    GetOrder(sortOrder));

            if (productFilter.TopicId != null)
            {
                linq = linq.Join(GetTopicRelationIds4Linq(productFilter.TopicId.Value), r => r.Id, v => v.Product_Id,
                                 (r, v) => r);
            }

            if (productFilter.PromotionId != null)
            {
                linq = linq.Join(GetListByPromotion4Linq(productFilter.PromotionId.Value), r => r.Id, v => v.ProdId,
                                 (r, v) => r);
            }

            var resetSet = linq;
            var orderBy  = GetOrder(sortOrder);

            resetSet = orderBy != null?orderBy(resetSet).AsQueryable() : resetSet.AsQueryable();

            totalCount = resetSet.Count();

            var skipCount = (pagerRequest.PageIndex - 1) * pagerRequest.PageSize;

            resetSet = skipCount == 0 ? resetSet.Take(pagerRequest.PageSize) : resetSet.Skip(skipCount).Take(pagerRequest.PageSize);

            return(resetSet);
        }
예제 #5
0
 public List <ProductEntity> GetPagedList(PagerRequest pagerRequest, out int totalCount,
                                          ProductSortOrder sortOrder, ProductFilter productFilter)
 {
     return(Get(pagerRequest, out totalCount, sortOrder, productFilter).ToList());
 }
예제 #6
0
        public List <ProductEntity> GetPagedList(PagerRequest pagerRequest, out int totalCount, ProductSortOrder sortOrder, Timestamp timestamp,
                                                 int?tagId, int?recommendUser, int?brandId)
        {
            List <int> tags;

            if (tagId == null)
            {
                tags = null;
            }
            else
            {
                tags = new List <int>(1)
                {
                    tagId.Value
                };
            }

            return
                (base.Get(Filter(DataStatus.Normal, timestamp, tags, recommendUser, brandId), out totalCount,
                          pagerRequest.PageIndex, pagerRequest.PageSize, GetOrder(sortOrder)).ToList());
        }
예제 #7
0
        public List <ProductEntity> GetPagedListForSearch(PagerRequest pagerRequest, out int totalCount, ProductSortOrder sortOrder, Timestamp timestamp,
                                                          string productName, int?recommendUser, List <int> tagids, int?brandId)
        {
            var filter = Filter(DataStatus.Normal, timestamp, tagids, recommendUser, brandId);

            if (!String.IsNullOrWhiteSpace(productName))
            {
                filter = filter.And(v => v.Name.StartsWith(productName));
            }

            return
                (base.Get(filter, out totalCount, pagerRequest.PageIndex, pagerRequest.PageSize, GetOrder(sortOrder))
                 .ToList());
        }
예제 #8
0
        public IQueryable <ProductEntity> Search(PagerRequest pagerRequest, out int totalCount, ProductSortOrder sortOrder, Timestamp timestamp,
                                                 string productName, string brandName, int?recommendUser, List <int> tagids, int?brandId, DataStatus?dataStatus)
        {
            var filter = Filter(dataStatus, timestamp, tagids, recommendUser, brandId);

            if (!String.IsNullOrWhiteSpace(productName))
            {
                filter = filter.And(v => v.Name.Contains(productName));
            }

            totalCount = 0;

            var p1 = base.Get(filter).Take(pagerRequest.PageSize);

            if (!String.IsNullOrEmpty(brandName))
            {
                var p2 = base.Get(Filter(dataStatus, timestamp, tagids, recommendUser, brandId));
                var b  = (ServiceLocator.Current.Resolve <IBrandRepository>().Get(DataStatus.Normal) as IQueryable <BrandEntity>).Where(v => v.Name.Contains(brandName) || v.EnglishName.Contains(brandName));
                var r  = p2.Join(b, v => v.Brand_Id, j => j.Id, (v, j) => v).Take(pagerRequest.PageSize);

                return(r.Union(p1).Take(pagerRequest.PageSize));
            }

            return(p1);
        }
예제 #9
0
        /// <summary>
        /// 排序
        /// </summary>
        /// <param name="sort"></param>
        /// <returns></returns>
        private static Func <IQueryable <ProductEntity>, IOrderedQueryable <ProductEntity> > GetOrder(ProductSortOrder sort)
        {
            Func <IQueryable <ProductEntity>, IOrderedQueryable <ProductEntity> > order = null;

            switch (sort)
            {
            case ProductSortOrder.CreatedDateDesc:
                order = v => v.OrderByDescending(s => s.CreatedDate);
                break;

            case ProductSortOrder.Default:
            default:
                order = v => v.OrderByDescending(s => s.SortOrder).ThenByDescending(s => s.CreatedDate);
                break;
            }

            return(order);
        }