문제

사용할 때 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에서 쿼리는 필요한 행만 선택합니다.


라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top