许多应用程序具有网格,一次显示一页数据库表中的数据。他们中的许多人还允许用户选择每页的记录数,按任何列排序以及在结果之间来回导航。

在不将整个表提交给客户端然后过滤客户端上的数据的情况下,实现此模式的好算法是什么?您如何仅将要显示的记录带给用户?

LINQ是否简化了解决方案?

最佳答案

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

T-SQL: Paging with 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;

10-07 22:59