Ray*_*Ray 92 .net sql sql-server
.Skip()
LINQ 中该方法的SQL等价物是什么?
例如:我想从特定的数据库表中选择行1000-1100.
这只能用SQL吗?或者我是否需要选择整个表,然后在内存中查找行?如果可能的话,我最好还是要避免这种情况,因为桌子可能非常大.
Joh*_*zen 135
SQL Server 2012及更高版本添加了以下语法:
SELECT *
FROM Sales.SalesOrderHeader
ORDER BY OrderDate
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
Run Code Online (Sandbox Code Playgroud)
Dan*_*plo 78
在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
Run Code Online (Sandbox Code Playgroud)
Rem*_*anu 22
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;
Run Code Online (Sandbox Code Playgroud)
这有效,但是需要从ORDER BY生成row_number 可能导致您的查询在服务器端进行排序并导致性能问题.即使索引可以满足ORDER BY要求,查询仍然必须在开始返回结果之前计数1000行.开发人员经常忘记这一点,只是在一个5密耳的行表上抛出一个分页控件,并想知道为什么第一页的返回速度比最后一页快得多......
尽管如此,使用ROW_NUMBER()可能是易用性和良好性能之间的最佳平衡,前提是确保避免排序(索引可以满足ORDER BY条件).
试试这个:
select * from [Table-Name] order by [Column-Name]
offset [Skip-Count] rows
FETCH NEXT [Take-Count] rows only
Run Code Online (Sandbox Code Playgroud)
例:
select * from Personals order by Id
offset 10 rows --------->Skip 10
FETCH NEXT 15 rows only --------->Take 15
Run Code Online (Sandbox Code Playgroud)