Example #1
0
        /// <summary>
        /// 对IEnumerable的分页查询的扩展,用法
        /// using ApiServer.Data;
        /// [HttpGet]
        /// public PagedData{Order} Get(string search, int page, int pageSize, string orderBy, bool desc)
        /// {
        ///     return context.Orders.Paging(context, page, pageSize, orderBy, desc,
        ///         string.IsNullOrEmpty(search) ? (Func{Order , bool}  )null : d => d.Id.HaveSubStr(search) || d.Name.HaveSubStr(search) || d.Content.HaveSubStr(search));
        /// }
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="src">IEnumerable<typeparamref name="T"/>的数据集合</param>
        /// <param name="context">DbContext对象,src应该在context.Set<typeparamref name="T"/>()能找到</param>
        /// <param name="page">需要第几页数据,从1开始,小于1则自动改为1,默认为1</param>
        /// <param name="pageSize">每页数据的数量,最小为1,默认为站点默认配置</param>
        /// <param name="orderBy">排序的属性名,区分大小写,且属性必须存在于类型<typeparamref name="T"/>中,默认为空</param>
        /// <param name="desc">是否是倒序排列,默认是升序</param>
        /// <param name="searchPredicate">用来查找或过滤的筛选函数,不需要此功能则传null即可</param>
        /// <returns></returns>
        public static async Task <PagedData <T> > Paging <T>(this IQueryable <T> src, int page, int pageSize, string orderBy, bool desc, Expression <Func <T, bool> > searchExpression) where T : class, IData
        {
            var            res  = new PagedData <T>();
            IQueryable <T> data = null;

            if (searchExpression == null)
            {
                data = src;
            }
            else
            {
                data = src.Where(searchExpression);
            }

            if (page < 1)
            {
                page = 1;
            }
            if (pageSize < 1)
            {
                pageSize = 10;
            }

            res.Total = await data.CountAsync();

            res.Page = page;

            if (!string.IsNullOrEmpty(orderBy))
            {
                try
                {
                    data = data.OrderBy(orderBy);
                    if (desc)
                    {
                        data = data.OrderByDescendingBy(orderBy);
                    }
                }
                catch { }// orderBy参数有误,比如名称不是类的成员
            }

            if (((page - 1) * pageSize) > res.Total)
            {
                res.Data = new List <T>();
                res.Size = 0;
            }
            else
            {
                try
                {
                    data = data.Skip((page - 1) * pageSize).Take(pageSize);
                    var datas = await data.ToListAsync();

                    res.Data = datas;
                    res.Size = res.Data.Count();
                }
                catch
                {
                }
            }
            return(res);
        }