首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

ADO.NET 應用層分頁技術:GridView、DataPager 與 LINQ 實作比較

     編輯:更多程式設計知識

應用層分頁核心概念

應用層分頁指一次性從資料庫撈回較大範圍的資料集,快取於伺服器記憶體(DataSet、List<T>、Session、Cache),再由前端控制項逐頁顯示。優點是後續翻頁無需再查資料庫,回應極快;缺點是首次查詢耗時較長,且佔用應用程式記憶體,不適合極大資料集。

三種主流實作方式

1. GridView + DataSource 快取

ASP.NET 2.0 起,GridView 內建分頁功能。搭配 SqlDataSource/ObjectDataSource 的 EnableCaching="true",資料源首次查詢後快取於伺服器,後續分頁直接從快取讀取。

<asp:SqlDataSource ID="srcProducts" runat="server" 
    ConnectionString="<%$ ConnectionStrings:Northwind %>" 
    SelectCommand="SELECT ProductID, ProductName, UnitPrice FROM Products"
    EnableCaching="true" CacheDuration="300" />
<asp:GridView ID="gvProducts" runat="server" DataSourceID="srcProducts" 
    AllowPaging="true" PageSize="10" />

2. DataPager 控制項

.NET 3.5 引入 DataPager,可搭配 ListView 使用,提供更靈活的分頁 UI(Numeric、NextPrevious、Template),並支援自訂分頁邏輯。

<asp:ListView ID="lvProducts" runat="server" DataSourceID="srcProducts">
    <LayoutTemplate><table><tr id="itemPlaceholder" runat="server" /></table></LayoutTemplate>
    <ItemTemplate><tr><td><%# Eval("ProductName") %></td></tr></ItemTemplate>
</asp:ListView>
<asp:DataPager ID="dpProducts" runat="server" PagedControlID="lvProducts" PageSize="10">
    <Fields>
        <asp:NumericPagerField ButtonCount="5" />
    </Fields>
</asp:DataPager>

3. LINQ to SQL / Entity Framework + Skip/Take

若資料量適中(如 < 10 萬筆),可一次 ToList() 進記憶體,再用 LINQ Skip()/Take() 分頁;或直接在 IQueryable 上翻頁(資料庫端分頁)。

// 記憶體分頁(資料已載入 List)
var pageData = allProducts.Skip((pageIndex-1)*pageSize).Take(pageSize).ToList();

// 資料庫端分頁(IQueryable,產生 SQL OFFSET/FETCH)
var pageData = dbContext.Products
    .OrderBy(p => p.ProductID)
    .Skip((pageIndex-1)*pageSize)
    .Take(pageSize)
    .ToList();

選型建議

場景建議方案
中小型資料集、頻繁翻頁、資料較少變動應用層快取 + GridView/DataPager
大型資料集、即時性要求高資料庫端分頁(OFFSET/FETCH 或 ROW_NUMBER)
彈性 UI、需自訂分頁樣板ListView + DataPager
現代專案、使用 EF CoreLINQ Skip/Take(自動轉譯為 SQL 分頁)

記憶體管理提醒

  • 快取資料集應設定過期時間(CacheDuration、SlidingExpiration)。
  • 大量使用者同時快取大資料集易導致 OOM,考慮用 OutputCache 或分散式快取。
  • 分頁邏輯封裝為通用 Helper 或 BaseController,避免重複撰寫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved