Answers:
在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 可能会导致您的查询在服务器端被排序并导致性能问题。即使索引可以满足ORDER BY要求,查询仍然必须计数1000行才能开始返回结果。开发人员常常忘记了这一点,只对500万行表进行了分页控制,想知道为什么首页返回的速度比最后一页快得多...
尽管如此,使用ROW_NUMBER()可能是在易用性和良好性能之间的最佳平衡,前提是您要确保避免排序(索引可以满足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
做这个:
在LINQ to SQL数据上下文上运行.Skip(1000).Take(100),然后查看SQL输出。它将为您生成执行您所描述的SQL语句。
它不会那么优雅,但是可以完成工作。
不,但是您可以模拟MySQL的LIMIT子句(堆栈溢出链接)以达到相同的结果。