1:集合進行分頁
/// <summary> /// 分頁處理 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="item"></param> /// <param name="pageSize"></param> /// <param name="singlePageList"></param> protected void ToPagingProcess<TEntity>(IEnumerable<TEntity> item, int pageSize, Action<IEnumerable<TEntity>> singlePageList) { if (item != null && item.Count() > 0) { var count = item.Count(); var pages = item.Count() / pageSize; if (count % pageSize > 0) { pages += 1; } for (int i = 1; i <= pages; i++) { var currentPageItem = item.Skip((i - 1) * pageSize).Take(pageSize); singlePageList(currentPageItem); } } }
注意:特殊情況下會存在數據重復的情況出現
2:SQL進行分頁
/// <summary> /// 用於顯示列表的公共參數 /// 無論前台頁面用何種Grid,這里做為系統Grid參數名不會變 /// </summary> public class GridParameter { /// <summary> /// 當前頁 /// </summary> public int Page { get; set; } /// <summary> /// 頁總數 /// </summary> public int TotalPages { get; set; } /// <summary> /// 行總數 /// </summary> public int Records { get; set; } /// <summary> /// 每頁顯示的行數 /// </summary> public int PageSize { get; set; } /// <summary> /// 排序列名 /// </summary> public string SortName { get; set; } /// <summary> /// 排序方式(asc/desc) /// </summary> public string SortOrder { get; set; } /// <summary> /// 不排序 /// </summary> /// <remarks> /// 這個問題也可以解決,可排序前判斷 q.Expression.ToString() 中是否含有".OrderBy("或".OrderByDescending(" /// </remarks> public bool NotSort { get; set; } /// <summary> /// 搜索內容 /// </summary> public string SearchText { get; set; } /// <summary> /// 搜索字段。 /// 在多字段搜索里不用此屬性 /// </summary> public string SearchField { get; set; } /// <summary> /// 用戶數據。通常配合統計結果,存入json數據。 /// </summary> public object UserData { get; set; } private string _statsSign = null; /// <summary> /// 統計標識,配合Stats屬性 /// </summary> public string StatsSign { get { return _statsSign; } set { _statsSign = value; if (!string.IsNullOrEmpty(_statsSign) && Stats == null) { Stats = new Dictionary<object, object>(); } } } /// <summary> /// 統計列表 /// </summary> public Dictionary<object, object> Stats { get; set; } public GridParameter() { } public GridParameter(int page, int pageSize, string sortName, string sortOrder, string searchText) { this.Page = page; this.PageSize = pageSize; this.SortName = sortName; this.SortOrder = sortOrder; this.SearchText = searchText; } }
protected List<T> GetPagedList<T>(string sql, GridParameter gp) { if (gp.Page <= 0) gp.Page = Defaults.GridPage; if (gp.PageSize <= 0) gp.PageSize = Defaults.GridPageSize; var endNum = (gp.Page - 1) * gp.PageSize;//分頁結束位置 var startNum = (gp.Page - 1) * gp.PageSize + gp.PageSize;//分頁開始位置 string orderBy = ""; //排序 if (!string.IsNullOrEmpty(gp.SortName)) { orderBy += " ROW_NUMBER() OVER(ORDER BY " + gp.SortName + " " + gp.SortOrder + ")"; } else { orderBy += " ROWNUM"; } //分頁SQL string sqlPage = string.Format("SELECT * FROM(SELECT TABLE1.*,{3} RN FROM({0}) TABLE1) WHERE RN<={1} AND RN>{2}", sql, startNum, endNum, orderBy); //查詢總數SQL string sqlTotal = string.Format("SELECT COUNT(1) FROM ({0})", sql); gp.Records = ObjContext.ExecuteStoreQuery<int?>(sqlTotal).FirstOrDefault() ?? 0; //執行SQL return ObjContext.ExecuteStoreQuery<T>(sqlPage, null).ToList(); }