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