¿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
SkipyTakees 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 utilizarSkipyTake:La clase define dos métodos de extensión: uno para
IEnumerabley 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á laIQueryableversión).Dependiendo de sus requisitos de paginación, también podría agregar algún comportamiento adicional (por ejemplo, para manejar negativo
pageSizeopagevalor). Aquí hay un ejemplo de cómo usaría este método de extensión en su consulta:fuente
IEnumerableinterfaz en lugar deIQueryableesto, se extraerá toda la tabla de la base de datos, lo que supondrá un gran impacto en el rendimiento.IQueryableque 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
SkipyTakeque será muy ineficaz si estás interesado en varias páginas.fuente
Paginatepara eliminarnounvsverbambigü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
Take10,Skip0 toma los primeros 10 elementos.Skip0 no tiene sentido y nunca debería hacerse. Y el orden deTakeySkipimporta -Skip10,Take10 toma elementos 10-20;Take10,Skip10 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