如何编写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');