Pagination générique avec le pimpant

asp.net-mvc dapper generics pagination

Question

J'utilise dapper et aussi dapper.contrib.Ma question est comment puis-je créer un cours de pagination générique. Voici ce que j'ai essayé jusqu'ici.

 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;

        }
}

Ce que je pense, c'est obtenir le nom T de la classe qui est le même que le nom de la table, et écrire une chaîne SQL appelée sql_statement qui est applicable pagination.later appliquer ce code.

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

Est-ce que ça a du sens? Je suis là pour mieux y parvenir.

Réponse acceptée

Il semble actuellement que vous prévoyez de récupérer toutes les lignes de la table, puis sélectionnez parmi elles la page de données dont vous avez réellement besoin. Il serait probablement plus rapide de sélectionner la page dont vous avez besoin directement à partir de la base de données, sauf si vous avez réellement besoin de toutes les lignes pour une raison quelconque.

En supposant que vos noms de table correspondent toujours exactement à leurs noms de classe / entité respectifs, les éléments suivants vous donneront un résultat paginé (en utilisant 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;
            }
    }

Une note à ce sujet. Je ne suis évidemment pas familier avec la structure ou la taille de votre base de données, mais pour la plupart des applications générales, l'approche limite / offset de la pagination présentée ici sera probablement suffisante. Il y a cependant quelques problèmes potentiels que vous pourriez vouloir considérer:

  1. Lorsque la valeur de décalage est très élevée, les performances peuvent en souffrir.
  2. Les tables de pagination présentant une fréquence élevée d'insertions de cette manière peuvent entraîner la duplication / l'apparition de résultats sur plusieurs pages, car les valeurs de décalage ne tiennent pas compte des nouvelles lignes ajoutées à la table depuis la dernière récupération.

Qu'ils soient ou non susceptibles de causer des problèmes à votre cas particulier, ces inconvénients potentiels, ainsi que certaines solutions alternatives, sont décrits ici .




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