按照通常的方式分頁查詢至少要查詢數據兩遍,一個操作是查詢總數,另一個是查詢數據,這樣有些耗時
這里介紹一個基於EF的插件 EntityFramework.Extended,當然這個插件有很多的功能,比方說批量刪除、批量修改、批量查詢、緩存查詢等
這里只介紹批量查詢的方法
通過SQL Server Profilter監視生成的SQL代碼,發現只連接了一次數據庫,非常的厲害
不解釋直接上代碼
通用分頁查詢方法:
1 /// <summary> 2 /// 分頁查詢 3 /// </summary> 4 /// <typeparam name="TKey">排序類型</typeparam> 5 /// <param name="pageIndex">當前頁</param> 6 /// <param name="pageSize">每頁大小</param> 7 /// <param name="isAsc">是否升序排列</param> 8 /// <param name="predicate">條件表達式</param> 9 /// <param name="keySelector">排序表達式</param> 10 /// <returns></returns> 11 public virtual IPage<TEntity> Page<TKey>(int pageIndex, int pageSize, Expression<Func<TEntity, bool>> predicate, bool isAsc, 12 Expression<Func<TEntity, TKey>> keySelector) 13 { 14 if (pageIndex <= 0 && pageSize <= 0) 15 { 16 throw new Exception("pageIndex或pageSize不能小於等於0!"); 17 } 18 IPage<TEntity> page = new Page<TEntity>() 19 { 20 PageIndex = pageIndex, 21 PageSize = pageSize 22 }; 23 int skip = (pageIndex - 1) * pageSize; 24 if (predicate == null) 25 { 26 FutureCount fcount = this.dbSet.FutureCount(); 27 FutureQuery<TEntity> futureQuery = isAsc 28 ? this.dbSet.OrderBy(keySelector).Skip(skip).Take(pageSize).Future() 29 : this.dbSet.OrderByDescending(keySelector).Skip(skip).Take(pageSize).Future(); 30 page.TotalItems = fcount.Value; 31 page.Items = futureQuery.ToList(); 32 page.TotalPages = page.TotalItems / pageSize; 33 if ((page.TotalItems % pageSize) != 0) page.TotalPages++; 34 } 35 else 36 { 37 var queryable = this.dbSet.Where(predicate); 38 FutureCount fcount = queryable.FutureCount(); 39 FutureQuery<TEntity> futureQuery = isAsc 40 ? queryable.OrderBy(keySelector).Skip(skip).Take(pageSize).Future() 41 : queryable.OrderByDescending(keySelector).Skip(skip).Take(pageSize).Future(); 42 page.TotalItems = fcount.Value; 43 page.Items = futureQuery.ToList(); 44 page.TotalPages = page.TotalItems / pageSize; 45 if ((page.TotalItems % pageSize) != 0) page.TotalPages++; 46 } 47 return page; 48 }
分頁實體:
1 /// <summary> 2 /// 分頁實體 3 /// </summary> 4 /// <typeparam name="T">實體</typeparam> 5 public class Page<T> : IPage<T> 6 { 7 /// <summary> 8 /// 當前頁 9 /// </summary> 10 public int PageIndex { get; set; } 11 /// <summary> 12 /// 總頁數 13 /// </summary> 14 public int TotalPages { get; set; } 15 /// <summary> 16 /// 查詢集合總個數 17 /// </summary> 18 public int TotalItems { get; set; } 19 /// <summary> 20 /// 每頁項數 21 /// </summary> 22 public int PageSize { get; set; } 23 /// <summary> 24 /// 查詢集合 25 /// </summary> 26 public IList<T> Items { get; set; } 27 } 28 29 /// <summary> 30 /// 分頁實體接口 31 /// </summary> 32 /// <typeparam name="T">實體</typeparam> 33 public interface IPage<T> 34 { 35 /// <summary> 36 /// 當前頁 37 /// </summary> 38 int PageIndex { get; set; } 39 /// <summary> 40 /// 總頁數 41 /// </summary> 42 int TotalPages { get; set; } 43 /// <summary> 44 /// 查詢集合總個數 45 /// </summary> 46 int TotalItems { get; set; } 47 /// <summary> 48 /// 每頁項數 49 /// </summary> 50 int PageSize { get; set; } 51 /// <summary> 52 /// 查詢集合 53 /// </summary> 54 IList<T> Items { get; set; } 55 }