예제 #1
0
        /// <summary>
        /// 获取商品状态的特征
        /// </summary>
        /// <param name="product">商品</param>
        /// <returns></returns>
        public static ProductStateTrait GetStateTrait(this Database.Product product)
        {
            var type = Application.Ioc.ResolveMany <IProductState>()
                       .First(s => s.State == product.State).GetType();

            return(ProductStateTrait.For(type));
        }
        /// <summary>
        /// 过滤数据
        /// </summary>
        public void OnQuery(
            StaticTableSearchRequest request, IDatabaseContext context, ref IQueryable <Database.Product> query)
        {
            // 按分类
            var classId = request.Conditions.GetOrDefault <long?>("class");

            if (classId != null)
            {
                query = query.Where(q => q.Classes.Any(c => c.Id == classId));
            }
            // 按标签
            var tagId = request.Conditions.GetOrDefault <long?>("tag");

            if (tagId != null)
            {
                query = query.Where(q => q.Tags.Any(t => t.Id == tagId));
            }
            // 按价格范围(这里不考虑货币)
            var priceRange = request.Conditions.GetOrDefault <string>("price_range");

            if (!string.IsNullOrEmpty(priceRange) && priceRange.Contains('~'))
            {
                var priceBounds = priceRange.Split('~');;
                var lowerBound  = priceBounds[0].ConvertOrDefault <decimal>();
                var upperBound  = priceBounds[1].ConvertOrDefault <decimal>();
                query = query.Where(q => q.MatchedDatas.Any(d => d.Price != null && d.Price >= lowerBound));
                if (upperBound > 0)
                {
                    query = query.Where(q => q.MatchedDatas.Any(d => d.Price != null && d.Price <= upperBound));
                }
            }
            // 按关键词
            if (!string.IsNullOrEmpty(request.Keyword))
            {
                query = query.Where(q => q.Name.Contains(request.Keyword));
            }
            // 只显示未删除且允许显示的商品
            var visibleStates = Application.Ioc.ResolveMany <IProductState>()
                                .Where(s => ProductStateTrait.For(s.GetType()).VisibleFromProductList)
                                .Select(s => s.State).ToList();

            query = query.Where(q => !q.Deleted && visibleStates.Contains(q.State));
        }