gpt4 book ai didi

NHibernate 与 SQL Server 分页

转载 作者:行者123 更新时间:2023-12-03 23:31:22 26 4
gpt4 key购买 nike

使用时 SetFirstResult(start)SetMaxResults(count)实现分页的方法我注意到生成的查询只执行 select top count * from some_table并且不需要start参数考虑或至少不在数据库级别。看来,如果我指示 NHibernate 执行以下查询:

var users = session.CreateCriteria<User>()
.SetFirstResult(100)
.SetMaxResults(5)
.List<User>();

105 条记录将在数据库服务器和应用程序之间传输,应用程序将负责剥离前 100 条记录。对于包含许多行的表,这可能是一个问题。

我已经用 SQLite 验证了这一点数据库 NHibernate 利用了 OFFSETLIMIT在数据库级别过滤结果的关键字。我知道没有等效的 OFFSET关键字和 Oracle 的 ROWNUM在 SQL Server 2000 中,但有什么解决方法吗? SQL Server 2005/2008 怎么样?

最佳答案

T-SQL,Microsoft SQL Server 使用的 SQL 语言的变体,没有 limit条款。它有一个 select top {...}您可以看到 NHibernate 在 SQL Server 2000 中利用的修饰符。

在 SQL Server 2005 中,Microsoft 引入了 Row_Number() over (order by {...})可用作 limit 的替代函数子句,您可以看到 NHibernate 在 SQL Server 2005/2008 中利用了这一点。

对 SQLite 的查询可能看起来像

select c.[ID], c.[Name]
from [Codes] c
where c.[Key] = 'abcdef'
order by c.[Order]
limit 20 offset 40

而 SQL Server 2005 的类似查询可能看起来像
select c.[ID], c.[Name]
from (
select c.[ID], c.[Name], c.[Order]
, [!RowNum] = Row_Number() over (order by c.[Order])
from [Codes] c
where c.[Key] = 'abcdef'
) c
where c.[!RowNum] > 40 and c.[!RowNum] <= 60
order by c.[Order]

或者,使用通用表表达式,它可能看起来像
with
[Source] as (
select c.[ID], c.[Name], c.[Order]
, [!RowNum] = Row_Number() over (order by c.[Order])
from [Codes] c
where c.[Key] = 'abcdef'
)
select c.[ID], c.[Name]
from [Source] c
where c.[!RowNum] > 40 and c.[!RowNum] <= 60
order by c.[Order]

在 SQL Server 2000 中也有一种方法可以做到这一点
select c.[ID], c.[Name]
from (
select top 20 c.[ID], c.[Name], c.[Order]
from (
select top 60 c.[ID], c.[Name], c.[Order]
from [Codes] c
where c.[Key] = 'abcdef'
order by c.[Order]
) c
order by c.[Order] desc
) c
order by c.[Order]

关于NHibernate 与 SQL Server 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com