如何解决为什么 System.Data.Linq 为 Paging 生成 ROW_NUMBER() 而不是 SQL Server 2012 的 OFFSET/FETCH
我们使用 Linq 和实体框架来访问 SQL Server 2012 数据库。我们遇到了一些性能问题,所以经过一些调查,我们能够解决一些问题,但我想使用带有 OFFSET/FETCH
而不是 ROW_NUMBER()
和 BETWEEN
语法的 SQL 查询.
性能差异不是那么大。 OFFSET/FETCH
快了大约 10%。您知道为什么生成的查询使用 ROW_NUMBER()
和 BETWEEN
语法吗?如何强制 Linq 生成 OFFSET/FETCH
查询?
C# 代码:
var orders = dc.Orders.OrderBy(q => q.LastModifiedTimestamp)
.Skip(q => skipCount)
.Take(q => takeCount)
.ToList();
当前生成的查询:
-- Region Parameters
DECLARE @p0 Int = 10
DECLARE @p1 Int = 10
-- EndRegion
SELECT [t2].[OrderId],[t2].[CustomerId]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t1].[OrderId],[t1].[CustomerId]
FROM (
SELECT DISTINCT [t0].[OrderId],[t0].[CustomerId]
FROM [Order] AS [t0]
) AS [t1]
) AS [t2]
WHERE [t2].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t2].[ROW_NUMBER]
首选查询:
SELECT *
FROM [Order]
ORDER BY LastModifiedTimestamp
OFFSET 10000 ROWS
FETCH NEXT 10000 ROWS ONLY
您知道为什么生成的查询使用 ROW_NUMBER()
和 BETWEEN
语法吗?如何强制 Linq 生成 OFFSET/FETCH
查询?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。