Dapper. La pagination

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

Mais je voudrais obtenir des résultats paginés ...

1 - Comment puis-je faire cela? N'est-il pas une aide pour cela?

2 - la requête Dapper peut-elle renvoyer un IQueryable?

Merci, Miguel

38
demandé sur Miguel Moura 2012-03-24 06:18:44

4 réponses

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>.

31
répondu Alex 2013-10-29 06:30:26

Vous n'avez pas spécifié de base de données ou de version. Si vous avez la chance d'utiliser le tout nouveau SQL Server 2012 et d'avoir accès à MSDN, vous pouvez utiliser les nouveaux mots clés OFFSET et FETCH. La requête suivante ignorera 20 enregistrements et retournera les 5 suivants.

SELECT * FROM [Posts]
ORDER BY [InsertDate]
OFFSET 20 ROWS
FETCH NEXT 5 ROWS ONLY

Vérifier http://msdn.microsoft.com/en-us/library/ms188385 (v=sql.110).aspx#Offset pour plus d'informations.

En outre, il est assez facile de copier la façon dont Massive le fait et d'écrire votre propre méthode d'extension pour IDbConnection. Voici le code de Massive.

var query = string.Format("SELECT {0} FROM (SELECT ROW_NUMBER() OVER (ORDER BY {2}) AS Row, {0} FROM {3} {4}) AS Paged ", columns, pageSize, orderBy, TableName, where);
61
répondu Jarrett Meyer 2012-03-28 23:07:25

J'ai créé un exemple de projet pour démo de la pagination personnalisée Dapper, du tri de support, des critères et du filtre:

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

Fondamentalement, 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 des éléments. La deuxième valeur de retour est le nombre total.

J'espère que ça aide.

Merci.

0
répondu JIN Weijie 2017-07-05 05:30:49

Si vous N'avez pas Sql Server 2012 ou si vous avez d'autres SGBD, une façon de faire la pagination est de diviser le traitement entre le SGBD et le serveur web ou le client. --- ceci est recommandé seulement pour la petite taille d'ensemble. Vous pouvez utiliser le mot clé' TOP ' dans Sql Server ou LIMIT dans MySql ou ROWNUM dans Oracle pour obtenir le nombre supérieur de lignes dans l'ensemble de données. Le nombre de lignes que vous récupéreriez est égal au nombre que vous sauteriez plus le nombre que vous prendriez:

top = skip + take;

Par exemple, vous je voudrais sauter 100 lignes et prendre les 50 suivantes:

top = 100 + 50

Donc, votre instruction SQL ressemblerait à ceci (saveur SQL server)

SELECT    TOP 150 Name, Modified, content, Created
FROM      Posts
WHERE     Created >= '1900-01-01'

Sur le Client: si vous utilisez un langage. net comme C# et que vous utilisez Dapper, vous pouvez utiliser linq pour ignorer un certain nombre de lignes et prendre un certain nombre de lignes comme ceci:

var posts = connection.Query<Post>(sqlStatement, dynamicParameters);
return posts?.ToList().Skip(skipValue).Take(takeValue);
-10
répondu ErnestoDeLucia 2016-12-09 14:39:49