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); }
/// <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); }