페이징은 이전 여러 섹션의 예제에 등장했으며 이제 자세히 설명하겠습니다.
이를 달성하는 방법에는 세 가지가 있습니다.
1. Top(int topCount) 메소드
sqlserver와 msaccess에서는 실제로 top이고, Oracle에서는 rownum을 통해 구현된다.
2. 시작(int startIndex, int endIndex)
startIndex 막대에서 endIndex 막대까지의 레코드 수입니다.
3. 페이지(int pageSize, int pageIndex)
페이지당 페이지 크기, pageIndex
다음은 이 세 가지 방법의 예입니다.
최고 방법:
DbSession.Default.From<제품>()
.상단(10)
.ToList(); 이 쿼리는 제품 테이블의 처음 10개 레코드를 쿼리합니다. 생성된 sql 문은 다음과 같습니다. (보기 구성 요소에서 생성된 sql을 출력하는 방법)
텍스트: 상위 10개 선택 * [제품]에서
방법에서:
DbSession.Default.From<제품>()
.(3, 8)에서
.ToList(); 항목 3부터 항목 8(항목 3과 8 포함)까지의 데이터를 검색합니다.
텍스트: SELECT * FROM ( SELECT TOP 6 * FROM ( SELECT TOP 8 * FROM [제품] ORDER BY [제품].[제품 ID] ASC) AS tempIntable ORDER BY [제품 ID] DESC) AS tempOuttable ORDER BY [제품 ID] ASC
페이지 방법:
DbSession.Default.From<제품>()
.페이지(10, 2)
.ToList(); 페이지당 10개 항목 중 2페이지의 데이터를 쿼리합니다. SQL 문은 다음과 같습니다.
텍스트: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [제품] ORDER BY [제품].[제품 ID] ASC) AS tempIntable ORDER BY [제품 ID] DESC) AS tempOuttable ORDER BY [제품 ID] ASC
from 메소드와 page 메소드에 의해 생성된 SQL 문은 실제로 동일한 형식을 가지고 있음을 알 수 있습니다. 실제로 page 메소드는 from 메소드를 호출합니다.
from의 startIndex 매개변수가 1이면 top 메소드가 호출되어 쿼리됩니다.
기본적으로 정렬을 설정하지 않습니다. 구성 요소는 자동으로 정렬을 추가합니다. 기본 키가 있으면 기본 키 정렬을 선택하고, 그렇지 않으면 정렬할 다른 열을 선택합니다.
물론 많은 경우 정렬할 열을 설정해야 합니다.
예를 들어:
DbSession.Default.From<제품>()
.페이지(10, 2)
.OrderBy(제품._.UnitPrice.Desc)
.Where(제품._.카테고리ID == 2)
.ToList(); 쿼리 조건은 Categoryid가 2이고 단가를 기준으로 역순으로 정렬되었으며 페이지당 2페이지에 10개의 데이터가 있다는 것입니다.
생성된 SQL은 다음과 같습니다.
텍스트: SELECT * FROM ( SELECT TOP 2 * FROM [제품] WHERE [제품].[범주 ID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [제품].[단가] ASC) AS temp_table ORDER BY [단가] DESC 매개변수: @bee7551993404c859 f9b01710bb5[ Int32 ] = 2 이 SQL 문은 예상치 못한 것입니까? 조건을 충족하는 쿼리의 두 번째 페이지에는 데이터가 2개만 있는 것으로 나타났으므로 쿼리할 때 단가를 상위 2위 순으로 사용하면 됩니다.
조건을 제거하고 살펴보겠습니다.
DbSession.Default.From<제품>()
.페이지(10, 2)
.OrderBy(제품._.UnitPrice.Desc)
//.Where(제품._.카테고리ID == 2)
.ToList(); 생성된 SQL은 다음과 같습니다.
텍스트: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [제품] ORDER BY [제품].[단가] DESC) AS tempIntable ORDER BY [단가] ASC) AS tempOuttable ORDER BY [단가] DESC 이제 일반 생성 형식을 사용할 수 있습니다.
위의 SQL 스크립트는 모두 SQL Server2000에서 생성되었습니다.
실제로 쿼리 과정에서 조건에 맞는 레코드의 count()개수까지 자동으로 쿼리하게 되므로 빅데이터의 경우 효율성이 그다지 좋지 않습니다.
설정한 데이터베이스가 sql server2005인 경우에는 count를 조회하지 않고 row_number()를 통해 직접 조회하여 효율성을 높인다. (오라클은 rownum으로 구현됨)
다음은 SQL Server2005의 예입니다.
DbSession.Default.From<제품>()
.페이지(10, 2)
.OrderBy(제품._.UnitPrice.Desc)
//.Where(제품._.카테고리ID == 2)
.ToList(); 코드는 여전히 위의 예와 동일하며 생성된 SQL은 다음과 같습니다.
텍스트: SELECT * FROM ( SELECT *,row_number() over( ORDER BY [Products].[UnitPrice] DESC) AS tmp__rowid FROM [Products] ) AS tmp_table WHERE (tmp__rowid BETWEEN 11 AND 20) 메서드 호출은 여전히 동일합니다. 따라서 from의 매개변수 startIndex가 1이면 여전히 top이 먼저 사용되고 row_numer()는 사용되지 않습니다.
물론 페이징이 충분히 이상적이지 않다고 생각되면 SQL이나 저장 프로시저를 직접 작성할 수 있습니다.