0

我开始弄乱 ASP.NET MVC 并遇到想要做一些基本分页的问题。所以我使用这个简单的 Linq 语句(使用 Northwind 数据库)来获取特定页面的 10 个项目:

var q = (from p in db.Orders
                     orderby p.OrderDate descending
                     select p).Skip(currentPage * pageAmount).Take(pageAmount);

它工作得很好,但是当我调试时,我很好奇 Linq to Sql 生成的实际 SQL 是什么。这是输出:

SELECT [t1].[OrderID], [t1].[CustomerID], [t1].[EmployeeID], [t1].[OrderDate], [t1].[RequiredDate], [t1].[ShippedDate], [t1].[ShipVia], [t1].[Freight], [t1].[ShipName], [t1].[ShipAddress], [t1].[ShipCity], [t1].[ShipRegion], [t1].[ShipPostalCode], [t1].[ShipCountry]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[OrderDate] DESC) AS [ROW_NUMBER], [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight], [t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPostalCode], [t0].[ShipCountry]
    FROM [dbo].[Orders] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

现在我根本不是 SQL 专家,这就是为什么我从未见过“OVER”子句的原因。我只是从高层次上很好奇它到底做了什么以及什么时候使用?

4

3 回答 3

3

ROW_NUMBER() OVER

返回结果集分区内行的序号,每个分区的第一行从 1 开始。

在您的示例中,结果集按降序排序OrderDate,然后将ROW_NUMBER函数应用于它。返回的结果集只会在哪里ROW_NUMBER is BETWEEN (@p0 + 1) and (@p0 + @p1)

正如 DOK 所说,OVER从句不是单独使用,而是与聚合和排名窗口函数结合使用。

来自MSDN -

OVER 子句 (Transact-SQL)

在应用关联的窗口函数之前确定行集的分区和排序。

于 2009-02-15T23:02:55.280 回答
1

它告诉ROW_NUMBER函数如何根据括号内的表达式为每一行分配一个数字。但是,这些行实际上并没有根据子查询中的这个数字进行排序。这就是外部查询中的排序的目的。

于 2009-02-15T23:01:01.820 回答
1

OVER 不单独使用。它与 RANK、DENSE RANK、NTILE 和 ROW NUMBER 结合使用。在本例中,它与 ROW_NUMBER 一起使用,仅检索当时显示所需的记录,在本例中为该页面的 10 个项目。

于 2009-02-15T23:03:01.833 回答