Como você implementaria a paginação em uma consulta LINQ? Na verdade, por enquanto, eu ficaria satisfeito se a função sql TOP pudesse ser imitada. No entanto, tenho certeza de que a necessidade de suporte de paginação completo surgirá mais tarde, de qualquer maneira.
var queryResult = from o in objects
where ...
select new
{
A = o.a,
B = o.b
}
????????? TOP 10????????
Usar
Skip
eTake
é definitivamente o caminho a percorrer. Se eu estivesse implementando isso, provavelmente escreveria meu próprio método de extensão para lidar com a paginação (para tornar o código mais legível). A implementação pode, obviamente, usarSkip
eTake
:A classe define dois métodos de extensão - um para
IEnumerable
e um paraIQueryable
, o que significa que você pode usá-lo com LINQ to Objects e LINQ to SQL (ao escrever uma consulta de banco de dados, o compilador escolherá aIQueryable
versão).Dependendo dos seus requisitos de paginação, você também pode adicionar algum comportamento adicional (por exemplo, para lidar com valores negativos
pageSize
oupage
) Aqui está um exemplo de como você usaria este método de extensão em sua consulta:fonte
IEnumerable
interface, em vez deIQueryable
puxar toda a tabela do banco de dados, será um grande impacto no desempenho.IQueryable
fazê-lo funcionar com consultas de banco de dados também (eu editei a resposta e a adicionei). É um pouco lamentável que você não possa escrever o código de uma forma totalmente genérica (em Haskell isso seria possível com classes de tipo). A pergunta original mencionava LINQ to Objects, então escrevi apenas uma sobrecarga.Esta é minha abordagem de desempenho para paginação ao usar LINQ para objetos:
Isso pode ser usado assim:
Nada disso é lixo
Skip
eTake
que será altamente ineficiente se você estiver interessado em várias páginas.fonte
Paginate
removernoun
vsverb
ambigüidade.fonte
Não sei se isso vai ajudar alguém, mas achei útil para meus objetivos:
Para usar isso, você deve ter alguma consulta linq e passar o resultado junto com o tamanho da página em um loop foreach:
Portanto, isso irá iterar sobre cada autor, obtendo 100 autores de cada vez.
fonte
EDIT - Removido Skip (0) porque não é necessário
fonte
Take
10,Skip
0 leva os primeiros 10 elementos.Skip
0 é inútil e nunca deve ser feito. E a ordem deTake
eSkip
importa -Skip
10,Take
10 leva os elementos 10-20;Take
10,Skip
10 não retorna nenhum elemento.Batchsize obviamente será um número inteiro. Isso tira vantagem do fato de que os inteiros simplesmente perdem as casas decimais.
Estou meio que brincando com esta resposta, mas ela fará o que você quiser e, como é adiada, você não incorrerá em uma grande penalidade de desempenho se o fizer
Essa solução não é para LinqToEntities, nem sei se poderia transformar isso em uma boa consulta.
fonte
Semelhante à resposta de Lukazoid, criei uma extensão para IQueryable.
É útil se Skip ou Take não forem suportados.
fonte
Eu uso este método de extensão:
fonte
isso é o que eu fiz. Normalmente você começa em 1, mas em IList você começa com 0. então se você tiver 152 linhas, isso significa que você tem 8 paginação, mas em IList você só tem 7. hop, isso pode deixar as coisas claras para você
fonte
fonte
Existem duas opções principais:
.NET> = 4.0 LINQ dinâmico :
var people = people.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
Você também pode obtê-lo pelo NuGet .
Métodos de extensão .NET <4.0 :
fonte