如何编写LINQ的.Skip(1000)。在纯SQL中取(100)?

什么是LINQ中.Skip()方法的SQL等价物?

例如:我想从特定的数据库表中select1000-1100行。

这是可能的只是SQL? 或者我需要select整个表,然后find内存中的行? 如果可能的话,我最好避免这种情况,因为桌子可能相当大。

在SQL Server 2005及更高版本中,您可以使用ROW_NUMBER函数。 例如。

 USE AdventureWorks; GO WITH OrderedOrders AS ( SELECT SalesOrderID, OrderDate, ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber' FROM Sales.SalesOrderHeader ) SELECT * FROM OrderedOrders WHERE RowNumber BETWEEN 51 AND 60; --BETWEEN is inclusive 

SQL Server 2012及更高版本添加了这个语法:

 SELECT * FROM Sales.SalesOrderHeader ORDER BY OrderDate OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY 

LINQ to SQL通过使用ROW_NUMBER窗口函数执行此操作:

  SELECT a,b,c FROM (SELECT a,b,c, ROW_NUMBER() OVER (ORDER BY ...) as row_number FROM Table) t0 WHERE to.row_number BETWEEN 1000 and 1100; 

这是有效的,但是需要从ORDER BY制造row_number 可能会导致您的查询在服务器端进行sorting并导致性能问题。 即使索引可以满足ORDER BY要求,在开始返回结果之前,查询仍然需要计数1000行。 开发人员经常忘记这一点,只是在5千行的表格上抛出一个分页控制,并想知道为什么第一页返回比最后一页快得多…

无论如何,使用ROW_NUMBER()可能是易用性和良好性能之间的最佳平衡,只要确保避免sorting(ORDER BY条件可以通过索引来满足)。

试试这个:

 select * from [Table-Name] order by [Column-Name] offset [Skip-Count] rows FETCH NEXT [Take-Count] rows only 

例:

 select * from Personals order by Id offset 10 rows --------->Skip 10 FETCH NEXT 15 rows only --------->Take 15 

做这个:

运行.Skip(1000)。将LINQ to SQL数据上下文(100)取出并查看SQL输出。 它会为你生成一个SQL语句,用来描述你正在描述的内容。

它不会那么优雅,但它完成了工作。

不,但是你可以模仿MySQL的LIMIT子句 (Stack Overflow链接)来达到同样的效果。

我使用这样的东西来select跳过前1000的第一个100。

 SELECT TOP(100) * FROM MY_TABLE WHERE ID not in (SELECT TOP(1000) ID From My_TABLE); 

如果要过滤更多结果,则需要使用相同的where子句:

 SELECT TOP(100) * FROM MY_TABLE WHERE WHERE Status = 'P' AND ID not in (SELECT TOP(1000) ID From My_TABLE WHERE Status = 'P');