SQL Server를 사용한 Nhibernate 페이징
-
22-07-2019 - |
문제
사용할 때 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가 OFFSET
그리고 LIMIT
데이터베이스 수준에서 결과를 필터링하는 키워드. 나는 OFFSET
키워드와 오라클 ROWNUM
SQL Server 2000에서 해결 방법이 있습니까? SQL Server 2005/2008은 어떻습니까?
해결책
Microsoft SQL Server가 사용하는 SQL 언어의 변형 인 T-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는 쿼리를 최적화 할만 큼 똑똑합니다. 처음 10 행을 선택하면 사용됩니다 TOP
성명. 첫 번째 행을 선택하지 않으면 사용됩니다. RowNum
.
SQL 2000에는 no가 있습니다 RowNum
기능적으로, 필요한 줄 수를 선택하는 것은 일반적인 쿼리에서 불가능한 이유입니다. SQL 2000의 경우 이러한 최적화 뷰가 사용되었습니다.
SQL 2005/2008에서 쿼리는 필요한 행만 선택합니다.