¿Cómo implementaría la paginación en una consulta LINQ? En realidad, por el momento, estaría satisfecho si se pudiera imitar la función sql TOP. Sin embargo, estoy seguro de que la necesidad de un soporte completo de paginación surge más pronto después de todos modos.
var queryResult = from o in objects
where ...
select new
{
A = o.a,
B = o.b
}
????????? TOP 10????????
Usar
Skip
yTake
es definitivamente el camino a seguir. Si estuviera implementando esto, probablemente escribiría mi propio método de extensión para manejar la paginación (para hacer el código más legible). Por supuesto, la implementación puede utilizarSkip
yTake
:La clase define dos métodos de extensión: uno para
IEnumerable
y otro paraIQueryable
, lo que significa que puede usarlo tanto con LINQ to Objects como con LINQ to SQL (al escribir una consulta de base de datos, el compilador elegirá laIQueryable
versión).Dependiendo de sus requisitos de paginación, también podría agregar algún comportamiento adicional (por ejemplo, para manejar negativo
pageSize
opage
valor). Aquí hay un ejemplo de cómo usaría este método de extensión en su consulta:fuente
IEnumerable
interfaz en lugar deIQueryable
esto, se extraerá toda la tabla de la base de datos, lo que supondrá un gran impacto en el rendimiento.IQueryable
que funcione también con consultas de base de datos (edité la respuesta y la agregué). Es un poco desafortunado que no pueda escribir el código de una manera completamente genérica (en Haskell esto sería posible con clases de tipos). La pregunta original mencionaba LINQ to Objects, así que escribí solo una sobrecarga.Aquí está mi enfoque de rendimiento para la paginación cuando uso LINQ to objects:
Esto luego se puede usar así:
Nada de esta basura
Skip
yTake
que será muy ineficaz si estás interesado en varias páginas.fuente
Paginate
para eliminarnoun
vsverb
ambigüedad.fuente
No sé si esto ayudará a alguien, pero lo encontré útil para mis propósitos:
Para usar esto, tendría una consulta de linq y pasaría el resultado junto con el tamaño de la página a un bucle foreach:
Entonces, esto iterará sobre cada autor obteniendo 100 autores a la vez.
fuente
EDITAR: se eliminó Skip (0) ya que no es necesario
fuente
Take
10,Skip
0 toma los primeros 10 elementos.Skip
0 no tiene sentido y nunca debería hacerse. Y el orden deTake
ySkip
importa -Skip
10,Take
10 toma elementos 10-20;Take
10,Skip
10 no devuelve ningún elemento.Obviamente, el tamaño del lote será un número entero. Esto aprovecha el hecho de que los números enteros simplemente caen decimales.
Estoy medio bromeando con esta respuesta, pero hará lo que quieras y, como está diferida, no incurrirás en una gran penalización de rendimiento si lo haces.
Esta solución no es para LinqToEntities, ni siquiera sé si podría convertir esto en una buena consulta.
fuente
Similar a la respuesta de Lukazoid, he creado una extensión para IQueryable.
Es útil si no se admiten Saltar o Tomar.
fuente
Yo uso este método de extensión:
fuente
Esto es lo que hice. Normalmente comienzas en 1, pero en IList comienzas con 0. así que si tienes 152 filas, eso significa que tienes 8 paginación, pero en IList solo tienes 7. hop, esto puede dejarte claro.
fuente
fuente
Hay dos opciones principales:
.NET> = 4.0 LINQ dinámico :
var people = people.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
También puede obtenerlo mediante NuGet .
Métodos de extensión .NET <4.0 :
fuente