コード例 #1
0
        /// <summary>
        /// 过滤数据
        /// </summary>
        public void OnQuery(
            StaticTableSearchRequest request, IDatabaseContext context, ref IQueryable <Database.Article> 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));
            }
            // 按关键词
            if (!string.IsNullOrEmpty(request.Keyword))
            {
                query = query.Where(q =>
                                    q.Title.Contains(request.Keyword) ||
                                    q.Summary.Contains(request.Keyword) ||
                                    q.Author.Username == request.Keyword);
            }
            // 只显示未删除的文章
            query = query.Where(q => !q.Deleted);
        }
コード例 #2
0
		/// <summary>
		/// 从数据库中的数据构建搜索回应
		/// 支持自动分页和配合表格回调设置结果
		/// </summary>
		/// <typeparam name="TData">数据类型</typeparam>
		/// <param name="request">搜索请求</param>
		/// <param name="callbacks">表格回调</param>
		/// <returns></returns>
		public static StaticTableSearchResponse BuildResponseFromDatabase<TData>(
			this StaticTableSearchRequest request, IEnumerable<IStaticTableCallback<TData>> callbacks)
			where TData : class, IEntity {
			var response = new StaticTableSearchResponse();
			UnitOfWork.Read(context => {
				// 从数据库获取数据,过滤并排序
				var query = context.Query<TData>();
				foreach (var callback in callbacks) {
					callback.OnQuery(request, context, ref query);
				}
				foreach (var callback in callbacks) {
					callback.OnSort(request, context, ref query);
				}
				// 分页并设置分页信息
				// 当前页没有任何内容时返回最后一页的数据
				var queryResult = response.Pagination.Paging(request, query);
				response.PageNo = request.PageNo;
				response.PageSize = request.PageSize;
				// 选择数据
				// 默认把对象转换到的字符串保存到ToString中
				var pairs = queryResult
					.Select(r => new EntityToTableRow<TData>(r))
					.ToList();
				foreach (var pair in pairs) {
					pair.Row["ToString"] = pair.Entity.ToString();
				}
				foreach (var callback in callbacks) {
					callback.OnSelect(request, pairs);
				}
				response.Rows = pairs.Select(p => p.Row).ToList();
			});
			return response;
		}
        public IActionResult StaticTable()
        {
            var request  = StaticTableSearchRequest.FromHttpRequest();
            var handlers = new ExampleStaticTableHandler().WithExtraHandlers();
            var response = request.BuildResponse(handlers);

            return(new TemplateResult("zkweb.examples/static_table.html", new { response }));
        }
コード例 #4
0
 public override void OnQuery(
     StaticTableSearchRequest request, ref IQueryable <ExampleTable> query)
 {
     if (!string.IsNullOrEmpty(request.Keyword))
     {
         query = query.Where(q => q.Name.Contains(request.Keyword));
     }
 }
コード例 #5
0
        /// <summary>
        /// 过滤数据
        /// </summary>
        public override void OnQuery(
            StaticTableSearchRequest request, ref IQueryable <Product> query)
        {
            // 按分类
            var classId = request.Conditions.GetOrDefault <Guid?>("class");

            if (classId != null)
            {
                query = query.Where(q => q.Classes.Any(c => c.Id == classId));
            }
            // 按分类列表
            var classIds = request.Conditions.GetOrDefault <IList <Guid> >("classes");

            if (classIds != null && classIds.Count > 0)
            {
                query = query.Where(q => q.Classes.Any(c => classIds.Contains(c.Id)));
            }
            // 按标签
            var tagId = request.Conditions.GetOrDefault <Guid?>("tag");

            if (tagId != null)
            {
                query = query.Where(q => q.Tags.Any(t => t.Id == tagId));
            }
            // 按标签列表
            var tagIds = request.Conditions.GetOrDefault <IList <Guid> >("tags");

            if (tagIds != null && tagIds.Count > 0)
            {
                query = query.Where(q => q.Tags.Any(t => tagIds.Contains(t.Id)));
            }
            // 按价格范围(这里不考虑货币)
            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 => s is IAmVisibleToThePublic)
                                .Select(s => s.State).ToList();

            query = query.Where(q => !q.Deleted && visibleStates.Contains(q.State));
        }
コード例 #6
0
 public override void OnSelect(
     StaticTableSearchRequest request, IList <EntityToTableRow <ExampleTable> > pairs)
 {
     foreach (var pair in pairs)
     {
         pair.Row["Id"]         = pair.Entity.Id;
         pair.Row["Name"]       = pair.Entity.Name;
         pair.Row["CreateTime"] = pair.Entity.CreateTime.ToClientTimeString();
     }
 }
コード例 #7
0
 /// <summary>
 /// 根据当前http请求获取搜索结果
 /// 结果会按请求参数和当前登录用户缓存一定时间
 /// </summary>
 /// <returns></returns>
 public virtual StaticTableSearchResponse GetArticleSearchResponseFromHttpRequest()
 {
     return(ArticleSearchResultCache.GetOrCreate(0, () => {
         var configManager = Application.Ioc.Resolve <GenericConfigManager>();
         var articleListSettings = configManager.GetData <ArticleListSettings>();
         var searchRequest = StaticTableSearchRequest.FromHttpRequest(
             articleListSettings.ArticlesPerPage);
         var handlers = new ArticleTableHandler().WithExtraHandlers();
         return searchRequest.BuildResponse(handlers);
     }, ArticleSearchResultCacheTime));
 }
コード例 #8
0
 /// <summary>
 /// 根据当前http请求获取搜索结果
 /// 结果会按请求参数和当前登录用户缓存一定时间
 /// </summary>
 /// <returns></returns>
 public virtual StaticTableSearchResponse GetProductSearchResponseFromHttpRequest()
 {
     return(ProductSearchResultCache.GetOrCreate(0, () => {
         var configManager = Application.Ioc.Resolve <GenericConfigManager>();
         var productListSettings = configManager.GetData <ProductListSettings>();
         var searchRequest = StaticTableSearchRequest.FromHttpRequest(
             productListSettings.ProductsPerPage);
         var callbacks = new ProductTableCallback().WithExtensions();
         var searchResponse = searchRequest.BuildResponseFromDatabase(callbacks);
         return searchResponse;
     }, ProductSearchResultCacheTime));
 }
コード例 #9
0
        /// <summary>
        /// 包装查询函数
        /// 默认根据搜索参数中的Deleted过滤已删除或未删除的对象
        /// </summary>
        public virtual Func <TResult> WrapQueryMethod <TResult>(
            StaticTableSearchRequest request, Func <TResult> queryMethod)
        {
            var uow     = Application.Ioc.Resolve <IUnitOfWork>();
            var deleted = request.Conditions.GetOrDefault <bool>("Deleted");

            return(() => {
                using (uow.DisableQueryFilter(typeof(DeletedFilter)))
                    using (uow.EnableQueryFilter(new DeletedFilter(deleted))) {
                        return queryMethod();
                    }
            });
        }
コード例 #10
0
        /// <summary>
        /// 从领域服务提供的数据构建搜索回应
        /// 支持自动分页和配合表格处理器设置结果
        /// </summary>
        /// <typeparam name="TData">数据类型</typeparam>
        /// <param name="request">搜索请求</param>
        /// <param name="callbacks">表格处理器</param>
        /// <returns></returns>
        public static StaticTableSearchResponse BuildResponse <TEntity, TPrimaryKey>(
            this StaticTableSearchRequest request,
            IEnumerable <IStaticTableHandler <TEntity, TPrimaryKey> > handlers)
            where TEntity : class, IEntity <TPrimaryKey>
        {
            var uow         = Application.Ioc.Resolve <IUnitOfWork>();
            var response    = new StaticTableSearchResponse();
            var service     = Application.Ioc.Resolve <IDomainService <TEntity, TPrimaryKey> >();
            var queryMethod = new Func <IList <TEntity> >(() => service.GetMany(query => {
                // 从服务获取数据,过滤并排序
                foreach (var handler in handlers)
                {
                    handler.OnQuery(request, ref query);
                }
                foreach (var handler in handlers)
                {
                    handler.OnSort(request, ref query);
                }
                // 分页并设置分页信息
                // 当前页没有任何内容时返回最后一页的数据
                return(response.Pagination.Paging(request, query));
            }));

            foreach (var handler in handlers)
            {
                // 包装查询函数
                queryMethod = handler.WrapQueryMethod(request, queryMethod);
            }
            using (uow.Scope()) {
                // 查询数据
                var result = queryMethod();
                // 设置当前页和每页数量
                response.PageNo   = request.PageNo;
                response.PageSize = request.PageSize;
                // 选择数据
                // 默认把对象转换到的字符串保存到ToString中
                var pairs = result.Select(r => new EntityToTableRow <TEntity>(r)).ToList();
                foreach (var pair in pairs)
                {
                    pair.Row["ToString"] = pair.Entity.ToString();
                }
                foreach (var callback in handlers)
                {
                    callback.OnSelect(request, pairs);
                }
                response.Rows = pairs.Select(p => p.Row).ToList();
            }
            return(response);
        }
コード例 #11
0
 /// <summary>
 /// 排序数据
 /// 默认更新时间或创建时间或Id倒序排列
 /// </summary>
 public virtual void OnSort(
     StaticTableSearchRequest request, ref IQueryable <TEntity> query)
 {
     if (UpdateTimeTypeTrait <TEntity> .HaveUpdateTime)
     {
         query = query.OrderByDescending(e => ((IHaveUpdateTime)e).UpdateTime);
     }
     else if (CreateTimeTypeTrait <TEntity> .HaveCreateTime)
     {
         query = query.OrderByDescending(e => ((IHaveCreateTime)e).CreateTime);
     }
     else
     {
         query = query.OrderByDescending(e => e.Id);
     }
 }
コード例 #12
0
        /// <summary>
        /// 选择数据
        /// </summary>
        public override void OnSelect(
            StaticTableSearchRequest request, IList <EntityToTableRow <Product> > pairs)
        {
            var albumManager = Application.Ioc.Resolve <ProductAlbumManager>();

            foreach (var pair in pairs)
            {
                var seller = pair.Entity.Seller;
                pair.Row["Id"]   = pair.Entity.Id;
                pair.Row["Name"] = new T(pair.Entity.Name);
                pair.Row["MainAlbumThumbnail"] = (
                    albumManager.GetAlbumImageWebPath(pair.Entity.Id, null, ProductAlbumImageType.Thumbnail));
                pair.Row["Price"]  = pair.Entity.MatchedDatas.GetPriceString();
                pair.Row["Seller"] = seller == null ? null : seller.Username;
            }
        }
コード例 #13
0
 /// <summary>
 /// 选择数据
 /// </summary>
 public void OnSelect(
     StaticTableSearchRequest request, List <EntityToTableRow <Database.Article> > pairs)
 {
     foreach (var pair in pairs)
     {
         var author    = pair.Entity.Author;
         var lastClass = pair.Entity.Classes.OrderByDescending(c => c.Id).LastOrDefault();
         pair.Row["Id"]          = pair.Entity.Id;
         pair.Row["Title"]       = pair.Entity.Title;
         pair.Row["Summary"]     = pair.Entity.Summary;
         pair.Row["Author"]      = author == null ? null : author.Username;
         pair.Row["AuthorId"]    = author == null ? null : (long?)author.Id;
         pair.Row["CreateTime"]  = pair.Entity.CreateTime.ToClientTimeString();
         pair.Row["LastClass"]   = lastClass == null ? null : new T(lastClass.Name).ToString();
         pair.Row["LastClassId"] = lastClass == null ? null : (long?)lastClass.Id;
         pair.Row["Tags"]        = pair.Entity.Tags.Select(t => new { t.Id, t.Name }).ToList();
     }
 }
コード例 #14
0
        /// <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));
        }
コード例 #15
0
        /// <summary>
        /// 根据当前http请求获取搜索结果
        /// 结果会按请求参数和当前登录用户缓存一定时间
        /// </summary>
        /// <returns></returns>
        public virtual StaticTableSearchResponse GetArticleSearchResponseFromHttpRequest()
        {
            // 从缓存获取
            var searchResponse = ArticleSearchResultCache.GetOrDefault(0);

            if (searchResponse != null)
            {
                return(searchResponse);
            }
            // 从数据库获取
            var configManager       = Application.Ioc.Resolve <GenericConfigManager>();
            var articleListSettings = configManager.GetData <ArticleListSettings>();
            var searchRequest       = StaticTableSearchRequest.FromHttpRequest(
                articleListSettings.ArticlesPerPage);
            var callbacks = new ArticleTableCallback().WithExtensions();

            searchResponse = searchRequest.BuildResponseFromDatabase(callbacks);
            // 保存到缓存中并返回
            ArticleSearchResultCache.Put(0, searchResponse, ArticleSearchResultCacheTime);
            return(searchResponse);
        }
コード例 #16
0
        /// <summary>
        /// 排序数据
        /// </summary>
        public override void OnSort(
            StaticTableSearchRequest request, ref IQueryable <Product> query)
        {
            var order = request.Conditions.GetOrDefault <string>("order");

            if (order == "best_sales")
            {
                // 最佳销量
                // 商品插件中不处理这个排序,有需要请使用其他插件处理
                query = query.OrderByDescending(q => q.Id);
            }
            else if (order == "lower_price")
            {
                // 更低价格
                query = query.Select(
                    q => new { q, minPrice = q.MatchedDatas.Where(m => m.Price != null).Min(m => m.Price) })
                        .Where(q => q.minPrice != null).OrderBy(q => q.minPrice).Select(q => q.q);
            }
            else if (order == "higher_price")
            {
                // 更高价格
                query = query.Select(
                    q => new { q, maxPrice = q.MatchedDatas.Where(m => m.Price != null).Max(m => m.Price) })
                        .Where(q => q.maxPrice != null).OrderByDescending(q => q.maxPrice).Select(q => q.q);
            }
            else if (order == "newest_on_sale")
            {
                // 最新上架
                query = query.OrderByDescending(q => q.UpdateTime);
            }
            else
            {
                // 默认排序,先按显示顺序再按更新时间
                query = query.OrderBy(q => q.DisplayOrder).ThenByDescending(q => q.UpdateTime);
            }
        }
コード例 #17
0
 /// <summary>
 /// 选择需要的字段
 /// </summary>
 public abstract void OnSelect(
     StaticTableSearchRequest request, IList <EntityToTableRow <TEntity> > pairs);
コード例 #18
0
 public override void OnSort(
     StaticTableSearchRequest request, ref IQueryable <ExampleTable> query)
 {
     query = query.OrderByDescending(q => q.Id);
 }
コード例 #19
0
 /// <summary>
 /// 过滤数据
 /// 默认不过滤数据
 /// </summary>
 public virtual void OnQuery(
     StaticTableSearchRequest request, ref IQueryable <TEntity> query)
 {
 }
コード例 #20
0
 /// <summary>
 /// 排序数据
 /// </summary>
 public override void OnSort(
     StaticTableSearchRequest request, ref IQueryable <Article> query)
 {
     // 默认先按显示顺序再按更新时间排序
     query = query.OrderBy(q => q.DisplayOrder).ThenByDescending(q => q.UpdateTime);
 }
コード例 #21
0
 /// <summary>
 /// 排序数据
 /// </summary>
 public void OnSort(
     StaticTableSearchRequest request, IDatabaseContext context, ref IQueryable <Database.Article> query)
 {
     // 默认先按显示顺序再按更新时间排序
     query = query.OrderBy(q => q.DisplayOrder).ThenByDescending(q => q.LastUpdated);
 }