Obtenir le résultat SQL Server Paginé ET le nombre total dans une requête via Dapper?

dapper pagination sql-server

Question

Si j'avais un modèle d' utilisateur qui ressemble à ceci:

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

... et j'effectuerais une requête qui commence à une ligne donnée et récupère un nombre limité de lignes supplémentaires (essentiellement pour paginer les résultats) qui ressemble à ceci:

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

.. utilisant Dapper (.Net), serait-il possible d’obtenir ce jeu de résultats limité ET le nombre total de lignes dans une seule requête et si oui, comment?

Réponse populaire

Une façon de résoudre ce problème consiste à utiliser la fonctionnalité splitOn, ainsi que count (1) sur ()

Supposons la chaîne sql suivante:

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

avec l'appel dapper.net suivant:

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);

Cela divisera le résultat de l'appel dapper en deux parties (comme pour joindre des tables différentes) et il appellera le foncteur cartographique à chaque fois, dans ce cas nous stockons simplement le compte dans un hashset (vous pouvez alors vérifier si le hashSet. Le compte est 1)

J'espère que cela t'aides

PS: Je ne suis pas certain que votre OFFSET fonctionne sans aucune COMMANDE PAR




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi