Pagination personnalisée à l'aide de la colonne de données avec espace dans les enregistrements

ado.net c# dapper pagination sql-server

Question

Pour implémenter une solution de pagination personnalisée en utilisant C#, ADO.Net , avec SQL Server en tant que base de données, supposons les détails suivants:

Total Records = 1000
Page Size = 100

Cela signifie qu'il y a 10 pages , j'utilise une requête comme suit:

Min and Max Id (Primary Key) sont récupérés à l'aide de requêtes scalaires:

Select Min(Id), Max(Id) from Table;

Select * from Table where Id >= (Min Record) and Id < (Max Record)

Ici, pour chaque transaction, Min and Max Record Value minimum Min and Max Record Value est incrémentée par taille de page, jusqu'à ce que le point Max atteigne ou dépasse la valeur Max réelle.

Cette solution fonctionne bien pour une colonne auto-incrémentation / identité, qui a des valeurs continues, mais supposons que la colonne utilisée a un écart de valeurs, même si elles peuvent toujours être ordonnées, comme 1000 values comprises entre Min = 1 and Max = 3000 .

  • J'ai le travail suivant possible autour, un suggéré dans le lien SO suivant, où une RowId column supplémentaire est utilisée pour obtenir la même chose.

  • D'autres options seraient d'ouvrir un lecteur et de lire un enregistrement pour une page donnée, de créer une liste et de récupérer ainsi une page.

Ce que je veux idéalement, c'est exécuter une requête sql Top <PageSize> , où elle est exécutée à partir d'une ligne ou d'une valeur prédéfinie que je suggère, au lieu de commencer, évitant ainsi de créer une colonne supplémentaire, aucun lecteur n'est requis.

Toute suggestion ou pointeur, s'il vous plaît laissez-moi savoir si une clarification est nécessaire, pour tout détail dans la question

Réponse acceptée

Si par hasard vous utilisez Sql Server 2012, vous pouvez utiliser

Chercher et compenser

par exemple

-- Variable to hold the offset value
Declare @RowSkip As int
-- Variable to hold the fetch value
Declare @RowFetch As int

--Set the value of rows to skip
 Set @RowSkip = 20000
--Set the value of rows to fetch
 Set @RowFetch = 50000

Select *
From dbo.tblSample 
Order by (Select 1)  
Offset @RowSkip Row 
Fetch  Next @RowFetch Rows Only;

Veuillez vous reporter à: Utilisation 1: Paging côté serveur pour plus de détails


Réponse populaire

Vous pouvez utiliser la fonction ROW_NUMBER dans une expression de table commune (CTE) :

WITH CTE AS
(
   SELECT 
    t.*, 
    RN = ROW_NUMBER() OVER (ORDER BY t.ID)
   FROM dbo.TableName t
)
SELECT ID, Col2, Col3, ...
FROM CTE 
WHERE RN >= (@pageIndedx * @pageSize) AND RN <= (@pageIndedx * @pageSize) + @pageSize


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