Пример #1
0
        /// <summary>
        /// 分页查询方法扩展二
        /// </summary>
        /// <param name="query">IQueryable对象</param>
        /// <param name="index">索引,最小值为1</param>
        /// <param name="pageSize">分页大小</param>
        /// <param name="wheres">过滤表达式</param>
        /// <param name="funOrderby">排序表达式,支持多重排序,此表达式使用,扩展的方式进行</param>
        /// <param name="selector">选择表达式</param>
        /// <typeparam name="TEntity">业务实体类型</typeparam>
        /// <typeparam name="TResult">结果集类型</typeparam>
        /// <returns>返回分页数据</returns>
        /// <exception cref="ArgumentNullException">当选择条件selector为null时,抛出此异常</exception>
        public static PageInfo <TResult> Query <TEntity, TResult>(this IQueryable <TEntity> query, int index,
                                                                  int pageSize,
                                                                  List <Expression <Func <TEntity, bool> > > wheres,
                                                                  Func <IQueryable <TEntity>, IQueryable <TEntity> > funOrderby,
                                                                  Func <IQueryable <TEntity>, List <TResult> > selector)
        {
            if (selector == null)
            {
                throw new ArgumentNullException("selector");
            }

            if (funOrderby == null)
            {
                throw new ArgumentNullException("funOrderby");
            }

            PageInfo.CheckPageIndexAndSize(ref index, ref pageSize);
            IQueryable <TEntity> queryable = query;

            if (wheres != null)
            {
                wheres.ForEach(p =>
                {
                    if (p != null)
                    {
                        queryable = queryable.Where(p);
                    }
                });
            }

            int count = queryable.Count();

            PageInfo.CheckPageIndexAndSize(ref index, pageSize, count);
            if (count > 0)
            {
                queryable = funOrderby(queryable);
                if (index != 1)
                {
                    queryable = queryable.Skip((index - 1) * pageSize);
                }

                queryable = queryable.Take(pageSize);
                return(new PageInfo <TResult>(index, pageSize, count, selector(queryable)));
            }

            return(new PageInfo <TResult>(index, pageSize, count, new List <TResult>()));
        }