針對 Access 資料庫不支援 ROW_NUMBER()、OFFSET/FETCH 的特性,實作基於 NOT IN 子查詢的通用分頁類,支援條件篩選、排序與頁碼跳轉。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace pager
{
public class Pager
{
public static string GetPager(string strWhere, int pagesize, int pageindex, string orderCol, string TableName)
{
if (pageindex == 1)
{
return "select top " + pagesize + " * from " + TableName + " order by " + orderCol + " DESC";
}
else
{
StringBuilder strSql = new StringBuilder();
strSql.AppendFormat("select top {0} * from {1} ", pagesize, TableName);
strSql.AppendFormat(" where {1} not in (select top {0} id from {2} ", pagesize * (pageindex - 1), orderCol, TableName);
if (strWhere.Trim() != "")
{
strSql.AppendFormat(" where {0} order by {1} DESC) and {0}", strWhere, orderCol);
}
else
{
strSql.AppendFormat(" order by {0} DESC) ", orderCol);
}
strSql.AppendFormat(" order by {0} DESC", orderCol);
return strSql.ToString();
}
}
}
}
SELECT TOP N * FROM Table ORDER BY Col DESCSELECT TOP N * FROM Table WHERE Col NOT IN (SELECT TOP (N-1)*PageSize Col FROM Table [WHERE ...] ORDER BY Col DESC) [WHERE ...] ORDER BY Col DESCNOT IN 子查詢在大資料量下效能急劇下降,子查詢需掃描前 N 頁資料orderCol 必須唯一(建議用 PK),否則分頁邊界會有資料遺漏或重複OFFSET @PageSize * (@PageIndex-1) ROWS FETCH NEXT @PageSize ROWS ONLYROW_NUMBER() OVER (ORDER BY Col) AS RowNum 包裝 CTE.Skip().Take() LINQ 轉譯最佳化分頁