Dot-Net
如何從 SQL 返回一頁結果?
許多應用程序都有網格,一次顯示一頁數據庫表中的數據。其中許多還允許使用者選擇每頁的記錄數,按任何列排序,並在結果中來回導航。
什麼是實現這種模式的好算法,而不是將整個錶帶到客戶端,然後在客戶端過濾數據。您如何只將要顯示的記錄提供給使用者?
LINQ 是否簡化了解決方案?
在 MS SQL Server 2005 及更高版本上,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]用簡單的英語:
過濾您的行並使用 ROW_NUMBER 函式按您想要的順序添加行號。
過濾器 (1) 僅返回頁面上所需的行號。
按行號對 (2) 進行排序,這與您想要的順序相同(在本例中,按名稱)。