Пример #1
0
        public static FutureCount FutureCount <TEntity>(this IQueryable <TEntity> source, ObjectQuery <TEntity> sourceQuery)
            where TEntity : class
        {
            if (source == null)
            {
                return(new FutureCount(0));
            }

            // create count expression
            var expression = Expression.Call(
                typeof(Queryable),
                "Count",
                new[] { source.ElementType },
                source.Expression);

            // create query from expression using internal ObjectQueryProvider
            ObjectQuery countQuery = sourceQuery.CreateQuery(expression, typeof(int));

            if (countQuery == null)
            {
                throw new ArgumentException("The source query must be of type ObjectQuery or DbQuery.", "source");
            }

            var futureContext = GetFutureContext(sourceQuery);
            var future        = new FutureCount(countQuery, futureContext.ExecuteFutureQueries);

            futureContext.AddQuery(future);
            return(future);
        }
Пример #2
0
        /// <summary>
        /// 分页查询
        /// </summary>
        /// <typeparam name="TKey">排序类型</typeparam>
        /// <param name="pageIndex">当前页</param>
        /// <param name="pageSize">每页大小</param>
        /// <param name="isAsc">是否升序排列,默认升序</param>
        /// <param name="predicate">查询条件表达式</param>
        /// <param name="keySelector">排序表达式</param>
        /// <returns></returns>
        public virtual IPage <T> Page <TKey>(int pageIndex, int pageSize, Expression <Func <T, bool> > predicate,
                                             Expression <Func <T, TKey> > keySelector, bool isAsc = true)
        {
            if (pageIndex <= 0 && pageSize <= 0)
            {
                throw new Exception("pageIndex或pageSize不能小于等于0!");
            }
            IPage <T> page = new Page <T>()
            {
                PageIndex = pageIndex,
                PageSize  = pageSize
            };
            int skip = (pageIndex - 1) * pageSize;

            if (predicate == null)
            {
                FutureCount     fcount      = this.dbset.FutureCount();
                FutureQuery <T> futureQuery = isAsc
                    ? this.dbset.AsNoTracking().OrderBy(keySelector).Skip(skip).Take(pageSize).Future()
                    : this.dbset.AsNoTracking().OrderByDescending(keySelector).Skip(skip).Take(pageSize).Future();
                page.TotalItems = fcount.Value;
                page.Items      = futureQuery.ToList();
                page.TotalPages = page.TotalItems / pageSize;
                if ((page.TotalItems % pageSize) != 0)
                {
                    page.TotalPages++;
                }
            }
            else
            {
                var             queryable   = this.dbset.AsNoTracking().Where(predicate);
                FutureCount     fcount      = queryable.FutureCount();
                FutureQuery <T> futureQuery = isAsc
                    ? queryable.OrderBy(keySelector).Skip(skip).Take(pageSize).Future()
                    : queryable.OrderByDescending(keySelector).Skip(skip).Take(pageSize).Future();
                page.TotalItems = fcount.Value;
                page.Items      = futureQuery.ToList();
                page.TotalPages = page.TotalItems / pageSize;
                if ((page.TotalItems % pageSize) != 0)
                {
                    page.TotalPages++;
                }
            }
            return(page);
        }
        /// <summary>
        /// Provides for defering the execution of the <paramref name="source" /> query to a batch of future queries.
        /// </summary>
        /// <typeparam name="TEntity">The type of the elements of <paramref name="source" />.</typeparam>
        /// <param name="source">An <see cref="T:System.Linq.IQueryable`1" /> to add to the batch of future queries.</param>
        /// <returns>An instance of <see cref="FutureCount"/> that contains the result of the query.</returns>
        /// <seealso cref="T:EntityFramework.Future.FutureCount"/>
        public static FutureCount FutureCount <TEntity>(this IQueryable <TEntity> source)
            where TEntity : class
        {
            if (source == null)
            {
                return(new FutureCount(0));
            }

            ObjectQuery sourceQuery = source.ToObjectQuery();

            if (sourceQuery == null)
            {
                // Early return for test scenarios, here so it only slows down the error path
                if (source is IFutureTestQueryable)
                {
                    return(new FutureCount(source, null));
                }

                throw new ArgumentException("The source query must be of type ObjectQuery or DbQuery.", "source");
            }

            // create count expression
            var expression = Expression.Call(
                typeof(Queryable),
                "Count",
                new[] { source.ElementType },
                source.Expression);

            // create query from expression using internal ObjectQueryProvider
            ObjectQuery countQuery = sourceQuery.CreateQuery(expression, typeof(int));

            var futureContext = GetFutureContext(sourceQuery);
            var future        = new FutureCount(countQuery, futureContext.ExecuteFutureQueries);

            futureContext.AddQuery(future);
            return(future);
        }