2009-02-15 46 views
0

我开始混淆ASP.NET MVC,并遇到了想要做一些基本Paging的问题。所以我用这个简单的LINQ语句(使用Northwind数据库),以获得10项特定页面:T-Sql中的“Over”子句究竟做了什么?

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

它运作良好,但后来当我调试,我很好奇,是由LINQ的产生什么实际的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”的条款。我只是从高层感到好奇,究竟是什么以及什么时候使用它?

回答

1

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

+0

谢谢!具有很多意义。 – BFree 2009-02-15 23:35:50

3

ROW_NUMBER() OVER

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

在您的示例中,结果集按降序排列OrderDate,然后对其应用ROW_NUMBER函数。返回的结果集只是在那里ROW_NUMBER is BETWEEN (@p0 + 1) and (@p0 + @p1)

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

MSDN -

OVER子句(Transact-SQL)

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

+0

+1,非常清晰 - 谢谢! – DCaugs 2013-06-26 15:00:52

1

OVER不单独使用。它与RANK,DENSE RANK,NTILE和ROW NUMBER结合使用。在这种情况下,它将与ROW_NUMBER一起用于检索当时需要显示的记录,在本例中为该页面的10个项目。