55 votes

Pimpant. Pagination

J'essaie Dapper ORM et j'interroge une table Posts.

Mais j'aimerais avoir des résultats paginés...

1 - Comment puis-je faire cela ? N'y a-t-il pas une aide pour cela?

2 - Dapper Query peut-il retourner un IQueryable ?

Merci, Miguel

44voto

Alex Points 4265

1) Dapper n'a pas de fonction de pagination intégrée. Mais ce n'est pas trop difficile de l'implémenter directement dans la requête. Exemple:

 SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY InsertDate) AS RowNum, *
          FROM      Posts
          WHERE     InsertDate >= '1900-01-01'
        ) AS result
WHERE   RowNum >= 1 // *your pagination parameters
    AND RowNum < 20  //*
ORDER BY RowNum

Nécessite SQL Server 2005+

2) Dapper renvoie un IEnumerable<T> .

6voto

Kbdavis07 Points 125

Voici une version fonctionnelle complète utilisant C# et Dapper.

 /// <summary>
    /// Gets All People
    /// </summary>
    /// <returns>List of People</returns>
    public IEnumerable<Person> GetAllPeople(Pager pager)
    {
        var sql = (@" select * from [dbo].[Person]
                      order by [PeplNo]
                      OFFSET      @Offset ROWS 
                      FETCH NEXT  @Next   ROWS ONLY");

        using (IDbConnection cn = Connection)
        {
            cn.Open();

            var results = cn.Query<Person>(sql,pager);

            return results;
        }
    }


public class Pager
{
    public int Page { get; set; }
    public int PageSize { get; set; }

    public int Offset { get; set; }
    public int Next { get; set; }

    public Pager(int page, int pageSize = 10)
    {
        Page = page < 1 ? 1 : page;
        PageSize = pageSize < 1 ? 10 : pageSize;

        Next = pageSize;
        Offset = (Page - 1) * Next;
    }

}

1voto

JIN Weijie Points 11

J'ai créé un exemple de projet pour faire une démonstration de la pagination personnalisée Dapper, prendre en charge le tri, les critères et le filtre :

https://github.com/jinweijie/Dapper.PagingSample

En gros, la méthode ressemble à ceci :

  Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria
        , int pageIndex
        , int pageSize
        , string[] asc
        , string[] desc);

La première valeur de retour est la liste d'articles. La deuxième valeur de retour est le nombre total.

J'espère que ça aide.

Merci.

1voto

Rokive Points 61
public async Task<IEnumerable<Blog>> GetBlogs(int pageNo = 1, int pageSize = 10)
{
    int skip = (pageNo - 1) * pageSize;

    using (var db = _context.GetOpenConnection())
    {
       var query = string.Format(@"SELECT * FROM [blog] ORDER BY [Id] OFFSET {0} ROWS FETCH NEXT {1} ROWS ONLY", skip, pageSize);
       
       var result = await db.QueryAsync<Blog>(query);

       return result;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X