DataTable 的 Paging 與 Sorting - 使用 Extension Method
程式碼:
1: using System.Data;
2: using System.Linq;
3:
4: /// <summary>
5: /// DataTable 的擴充方法類別
6: /// </summary>
7: public static class DataTableExtensionMethods
8: {
9: /// <summary>
10: /// DataTable 分頁與排序
11: /// </summary>
12: /// <param name="dt">DataTable 資料來源</param>
13: /// <param name="PageIndex">第 n 頁(Index 由 1 開始)</param>
14: /// <param name="PageSize">每頁資料筆數</param>
15: /// <param name="SortField">排序的欄位名稱(大小寫不分)</param>
16: /// <param name="IsDescending">設定 true 則為 Descending;否則為 Aescending。</param>
17: /// <returns>分頁與排序後的 DataTable</returns>
18: public static DataTable PagingAndSorting(this DataTable dt, int PageIndex, int PageSize, string SortField, bool IsDescending)
19: {
20: // 檢查 頁數不是為正數 或是 單頁資料筆數不是正數
21: if (PageIndex <= 0 || PageSize <= 0)
22: {
23: dt.Rows.Clear();
24: return dt;
25: }
26:
27: // 計算跳過多少筆數
28: var skip = (PageIndex - 1) * PageSize;
29:
30: // (1) 略過筆數超過總筆數 (頁數錯誤) (2) 不包含 SortField 欄位
31: if (skip >= dt.Rows.Count || dt.Columns.Contains(SortField) == false)
32: {
33: dt.Rows.Clear();
34: return dt;
35: }
36:
37: // 由大到小排序 DESC
38: if (IsDescending)
39: {
40: return dt.AsEnumerable().OrderByDescending(dr => dr[SortField]).Skip(skip).Take(PageSize).CopyToDataTable();
41: }
42:
43: // 由小到大排序 ASC
44: return dt.AsEnumerable().OrderBy(dr => dr[SortField]).Skip(skip).Take(PageSize).CopyToDataTable();
45: }
46: }
針對 DataTable 的 Extension Method,主要目的用來 Paging (分頁) 與 Sorting (排序),減少資料傳輸量。
Paging 部分,使用 LINQ 的 Skip (略過) 與 Take (取用) 來計算擷取的資料範圍。
Sorting 部分,則是使用 LINQ 的 OrderBy 與 OrderByDescending 來指定排序方向。
參考:
(1) Enumerable..::.Skip<(Of <(TSource>)>) Method
(2) Enumerable..::.Take<(Of <(TSource>)>) Method