Obtenga el resultado paginado de SQL Server Y el recuento total en una consulta a través de Dapper.

dapper pagination sql-server

Pregunta

Si tuviera un modelo de usuario que se parece a esto:

public class User
{
    public Guid Id { get; set; }
    public DateTime CreatedAtUtc { get; set; }
    public string Username { get; set; }
    public string Country { get; set; }
}

... y realizaría una consulta que comienza en una fila dada y recupera una cantidad limitada de filas adicionales (básicamente para paginar sobre los resultados) que se ve así:

var spaniards = connection.Query<User>(
                    "select * from Users where Country=@Country OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY",
                    new { Country = "Spain" }).ToList();

.. usando Dapper (.Net), ¿sería posible obtener ese conjunto de resultados particular y limitado Y el recuento total de filas en una sola consulta y, si es así ... cómo?

Respuesta popular

Una forma de resolver esto es usar la funcionalidad splitOn, junto con count (1) over ()

Supongamos la siguiente cadena sql:

var sql = "select *, overall_count = COUNT(1) OVER() from Users ORDER BY Id Asc OFFSET 5 ROWS;"

junto con la siguiente llamada de dapper.net:

HashSet<int> hashSet = new HashSet<int>();
Func<User, int, User> map = (result, count) =>
{
   hashSet.Add(count);
   return result;
};
await connection.QueryAsync(sql, map, "overall_count").ConfigureAwait(false);

Esto dividirá el resultado de la llamada dapper en dos partes (al igual que con la unión de diferentes tablas) y llamará al functor del mapa cada vez, en este caso, simplemente almacenaremos el conteo en un hashset (podría verificar si hashSet. Count es 1)

Espero que esto ayude

PD: No estoy seguro de que su OFFSET funcione sin ninguna ORDEN DE



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é