Paginación genérica con el apuesto

asp.net-mvc dapper generics pagination

Pregunta

Estoy usando dapper y también dapper.contrib.Mi pregunta es cómo puedo crear una clase de paginación genérica. Aquí está lo que he intentado hasta ahora.

 public class GenericRepository<T> :IGenericRepository<T> where T : class
    {
    public  async Task<IEnumerable<T>> GetAllPagedAsync(int limit,int offset)
        {
            var list = await Connection.GetAllAsync<T>();//but this return IEnumarable
            return list;

        }
}

Lo que estoy pensando es obtener el nombre T de la clase, que es lo mismo que Nombre de tabla, y escribir una cadena sql llamada sql_statement que es aplicar pagination.later, aplicar este código.

 var list = await Connection.QueryAsync<T>("sql_statement")

¿Esto tiene sentido? Existe alguna forma mejor de lograr eso.

Respuesta aceptada

Actualmente parece que está planeando recuperar todas las filas de la tabla y luego seleccionar de ellas la página de datos que realmente necesita. Probablemente sea más rápido seleccionar la página que necesita directamente desde la base de datos, a menos que realmente necesite todas las filas por alguna razón.

Asumiendo que los nombres de su tabla siempre coincidirán exactamente con sus nombres de clase / entidad respectivos, lo siguiente le dará un resultado paginado (usando postgres):

public class GenericRepository<T> : IGenericRepository<T> where T : class
        {
        public async Task<IEnumerable<T>> GetAllPagedAsync(int limit, int offset)
            {
                var tableName = typeof(T).Name;             
                // assuming here you want the newest rows first, and column name is "created_date"
                // may also wish to specify the exact columns needed, rather than *
                var query = "SELECT * FROM @TableName ORDER BY created_date DESC Limit @Limit Offset @Offset";
                var results = Connection.QueryAsync<T>(query, new {Limit = limit, Offset = offset});
                return results;
            }
    }

Una nota con respecto a esto. Obviamente no estoy familiarizado con la estructura o el tamaño de su base de datos, sin embargo, para los fines más generales, el enfoque de límite / desplazamiento para la búsqueda que se muestra aquí probablemente sea suficiente. Sin embargo, hay algunos problemas potenciales que quizás desee considerar:

  1. Cuando el valor de compensación es muy grande, el rendimiento puede verse afectado.
  2. Las tablas de paginación con una alta frecuencia de inserciones de esta manera pueden hacer que los resultados se dupliquen / aparezcan en varias páginas, ya que los valores de desplazamiento no tienen en cuenta las nuevas filas agregadas a la tabla desde la última recuperación.

Independientemente de si es probable que esto cause problemas en su caso particular, estos posibles inconvenientes, así como algunas soluciones alternativas se describen aquí .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué