DataTable 的 Paging 與 Sorting - 使用 Extension Method

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

(3) Generic List Sorting in C# 3.0

(4) LINQ - ThenBy、ThenByDescending