Dot-Net

如何從 SQL 返回一頁結果?

  • June 25, 2020

許多應用程序都有網格,一次顯示一頁數據庫表中的數據。其中許多還允許使用者選擇每頁的記錄數,按任何列排序,並在結果中來回導航。

什麼是實現這種模式的好算法,而不是將整個錶帶到客戶端,然後在客戶端過濾數據。您如何只將要顯示的記錄提供給使用者?

LINQ 是否簡化了解決方案?

在 MS SQL Server 2005 及更高版本上,ROW_NUMBER()似乎工作:

T-SQL:使用 ROW_NUMBER() 進行分頁

DECLARE @PageNum AS INT;
DECLARE @PageSize AS INT;
SET @PageNum = 2;
SET @PageSize = 10;

WITH OrdersRN AS
(
   SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
         ,OrderID
         ,OrderDate
         ,CustomerID
         ,EmployeeID
     FROM dbo.Orders
)

SELECT * 
 FROM OrdersRN
WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1 
                 AND @PageNum * @PageSize
ORDER BY OrderDate
        ,OrderID;

我建議要麼使用 LINQ,要麼嘗試複製它的功能。我有一個應用程序,我在其中使用 LINQ Take 和 Skip 方法來檢索分頁數據。程式碼看起來像這樣:

MyDataContext db = new MyDataContext();
var results = db.Products
   .Skip((pageNumber - 1) * pageSize)
   .Take(pageSize);

執行 SQL Server Profiler 顯示 LINQ 正在將此查詢轉換為類似於以下內容的 SQL:

SELECT [ProductId], [Name], [Cost], and so on...
FROM (
   SELECT [ProductId], [Name], [Cost], [ROW_NUMBER]
   FROM (
      SELECT ROW_NUMBER() OVER (ORDER BY [Name]) AS [ROW_NUMBER], 
          [ProductId], [Name], [Cost]
      FROM [Products]
   )
   WHERE [ROW_NUMBER] BETWEEN 10 AND 20
)
ORDER BY [ROW_NUMBER]

用簡單的英語:

  1. 過濾您的行並使用 ROW_NUMBER 函式按您想要的順序添加行號。

  2. 過濾器 (1) 僅返回頁面上所需的行號。

  3. 按行號對 (2) 進行排序,這與您想要的順序相同(在本例中,按名稱)。

引用自:https://stackoverflow.com/questions/10190