/// <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 <see cref="T:System.Collections.Generic.IEnumerable`1" /> that contains elements from the input sequence.</returns> /// <seealso cref="T:EntityFramework.Future.FutureQuery`1"/> public static FutureQuery <TEntity> Future <TEntity>(this IQueryable <TEntity> source) where TEntity : class { if (source == null) { throw new ArgumentNullException("source"); } ObjectQuery <TEntity> sourceQuery = source.ToObjectQuery(); if (sourceQuery == null) { // Early return for test scenarios, here so it only slows down the error path if (source is IFutureTestQueryable <TEntity> ) { return(new FutureQuery <TEntity>(source, null)); } throw new ArgumentException("The source query must be of type ObjectQuery or DbQuery.", "source"); } var futureContext = GetFutureContext(sourceQuery); var future = new FutureQuery <TEntity>(sourceQuery, 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 <see cref="T:System.Collections.Generic.IEnumerable`1" /> that contains elements from the input sequence.</returns> /// <seealso cref="T:EntityFramework.Future.FutureQuery`1"/> public static FutureQuery <TEntity> Future <TEntity>(this IQueryable <TEntity> source) where TEntity : class { if (source == null) { throw new ArgumentNullException("source"); } ObjectQuery <TEntity> sourceQuery = source.ToObjectQuery(); if (sourceQuery == null) { throw new ArgumentException("The source query must be of type ObjectQuery or DbQuery.", "source"); } var futureContext = GetFutureContext(sourceQuery); var future = new FutureQuery <TEntity>(sourceQuery, futureContext.ExecuteFutureQueries); futureContext.AddQuery(future); return(future); }