A paginação apareceu em exemplos em diversas seções anteriores e agora iremos explicá-la em detalhes.
Existem três maneiras de conseguir isso:
1. Método superior (int topCount)
No sqlserver e no msaccess, é realmente o melhor e, no Oracle, é implementado por meio de rownum.
2. De(int startIndex, int endIndex)
O número de registros da barra startIndex até a barra endIndex.
3. Página (int pageSize, int pageIndex)
pageSize por página, pageIndex
Abaixo estão exemplos desses três métodos, por sua vez.
método superior:
DbSession.Default.From<Produtos>()
.Topo(10)
.ToList(); Esta consulta consulta os primeiros 10 registros na tabela de produtos A instrução sql gerada é a seguinte: (Como gerar o sql gerado pelo componente de visualização)
Texto: SELECIONE TOP 10 * DE [Produtos]
do método:
DbSession.Default.From<Produtos>()
.De(3, 8)
.ToList(); procura dados do item 3 ao item 8 (incluindo os itens 3 e 8). A instrução SQL gerada é a seguinte:
Texto: SELECT * FROM ( SELECT TOP 6 * FROM ( SELECT TOP 8 * FROM [Products] ORDER BY [Products]. [ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
método de página:
DbSession.Default.From<Produtos>()
.Página(10, 2)
.ToList(); Consulte os dados na página 2 de 10 itens por página. A instrução sql é a seguinte:
Texto: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
Pode-se observar que as instruções SQL geradas pelo método from e pelo método page têm o mesmo formato. Na verdade, o método page, em última análise, chama o método from.
Se o parâmetro startIndex de from for igual a 1, o método top será chamado para consulta.
Por padrão, não definimos uma classificação. O componente adicionará automaticamente uma classificação. Se houver uma chave primária, escolha a classificação da chave primária, caso contrário, escolha outra coluna para classificar.
É claro que, em muitos casos, precisamos definir quais colunas classificar.
Por exemplo:
DbSession.Default.From<Produtos>()
.Página(10, 2)
.OrderBy(Produtos._.UnitPrice.Desc)
.Where(Produtos._.CategoryID == 2)
.ToList(); A condição de consulta é que CategoryID seja igual a 2, classificado por preço unitário de trás para frente e haja 10 dados na página 2 por página.
O sql gerado é o seguinte:
Texto: SELECT * FROM ( SELECT TOP 2 * FROM [Products] WHERE [Products].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Products].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] DESC Parâmetros: 2f07f9b01710bb5[ Int32] = 2 Esta instrução sql é inesperada? Acontece que a segunda página da consulta que atende às condições possui apenas 2 dados, portanto, ao consultar, basta usar o preço unitário na ordem positiva dos 2 primeiros e pronto.
Vamos remover a condição e dar uma olhada:
DbSession.Default.From<Produtos>()
.Página(10, 2)
.OrderBy(Produtos._.UnitPrice.Desc)
//.Where(Produtos._.CategoryID == 2)
.ToList(); O sql gerado é o seguinte:
Texto: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[UnitPrice] DESC) AS tempIntable ORDER BY [UnitPrice] ASC) AS tempOuttable ORDER BY [UnitPrice] DESC Isto é O formato normal gerado agora está disponível.
Os scripts SQL acima são todos gerados no SQL Server2000.
Na verdade, durante o processo de consulta, o estabelecimento também irá consultar automaticamente o count() número de registros que atendam às condições, portanto, no caso de big data, a eficiência não será muito boa.
Se o banco de dados que você configurou for sql server2005, a contagem não será consultada, mas será consultada diretamente por meio de row_number() para obter melhor eficiência. (Oracle é implementado por rownum)
Aqui está um exemplo de SQL Server2005:
DbSession.Default.From<Produtos>()
.Página(10, 2)
.OrderBy(Produtos._.UnitPrice.Desc)
//.Where(Produtos._.CategoryID == 2)
.ToList(); O código ainda é o mesmo do exemplo acima e o sql gerado é:
Texto: 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) A chamada do método ainda é a mesma, então, se o parâmetro startIndex de from for igual a 1, top ainda será usado primeiro e row_numer() não será usado.
Claro, se você acha que a paginação não é ideal o suficiente, você mesmo pode escrever SQL ou procedimentos armazenados.