La pagination est apparue dans des exemples dans plusieurs sections précédentes, et nous allons maintenant l'expliquer en détail.
Il existe trois manières d'y parvenir :
1. Méthode Top(int topCount)
Dans sqlserver et msaccess, c'est en fait top, et dans Oracle, il est implémenté via rownum.
2. De (int startIndex, int endIndex)
Le nombre d'enregistrements de la barre startIndex à la barre endIndex.
3. Page (int pageSize, int pageIndex)
pageTaille par page, pageIndex
Vous trouverez ci-dessous des exemples de ces trois méthodes tour à tour.
méthode supérieure :
DbSession.Default.From
.Haut(10)
.ToList(); Cette requête interroge les 10 premiers enregistrements de la table products. L'instruction SQL générée est la suivante : (Comment afficher le SQL généré par le composant de visualisation)
Texte : SELECT TOP 10 * FROM [Produits]
de la méthode :
DbSession.Default.From
.De(3, 8)
.ToList(); recherche les données de l'élément 3 à l'élément 8 (y compris les éléments 3 et 8). L'instruction SQL générée est la suivante :
Texte : SELECT * FROM ( SELECT TOP 6 * FROM ( SELECT TOP 8 * FROM [Produits] ORDER BY [ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
méthode de page :
DbSession.Default.From
.Page(10, 2)
.ToList(); Interrogez les données de la page 2 sur 10 éléments par page. L'instruction SQL est la suivante :
Texte : SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Produits] ORDER BY [ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
On peut voir que les instructions SQL générées par la méthode from et la méthode page ont le même format. En fait, la méthode page appelle finalement la méthode from.
Si le paramètre startIndex de from est égal à 1, la méthode top sera appelée pour interroger.
Par défaut, nous ne définissons pas de tri. Le composant ajoutera automatiquement un tri. S'il existe une clé primaire, choisissez le tri par clé primaire, sinon choisissez une autre colonne à trier.
Bien sûr, dans de nombreux cas, nous devons définir les colonnes à trier.
Par exemple:
DbSession.Default.From
.Page(10, 2)
.OrderBy(Produits._.UnitPrice.Desc)
.Où(Produits._.CategoryID == 2)
.ToList(); La condition de requête est que l'ID de catégorie est égal à 2, trié par prix unitaire vers l'arrière, et qu'il y a 10 données sur la page 2 par page.
Le SQL généré est le suivant :
Texte : SELECT * FROM ( SELECT TOP 2 * FROM [Produits] WHERE [Produits].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Produits].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] Paramètres DESC : @bee7551993404c859 2f07f9b01710 bb5[ Int32 ] = 2 Cette instruction SQL est-elle inattendue ? Il s'avère que la deuxième page de la requête qui remplit les conditions ne contient que 2 éléments de données, donc lors de l'interrogation, utilisez simplement le prix unitaire dans l'ordre positif top 2 et c'est fait.
Supprimons la condition et jetons un œil :
DbSession.Default.From
.Page(10, 2)
.OrderBy(Produits._.UnitPrice.Desc)
//.Où(Produits._.CategoryID == 2)
.ToList(); Le SQL généré est le suivant :
Texte : SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Produits] ORDER BY [Produits].[UnitPrice] DESC) AS tempIntable ORDER BY [UnitPrice] ASC) AS tempOuttable ORDER BY [UnitPrice] DESC Ceci est Le format généré normal est maintenant disponible.
Les scripts SQL ci-dessus sont tous générés sous SQL Server2000.
En fait, lors du processus de requête, l'établissement interrogera également automatiquement le nombre count() d'enregistrements qui remplissent les conditions, donc dans le cas du big data, l'efficacité ne sera pas très bonne.
Si la base de données que vous avez configurée est SQL Server2005, le nombre ne sera pas interrogé, mais sera interrogé directement via row_number() pour obtenir une meilleure efficacité. (Oracle est implémenté par rownum)
Voici un exemple de SQL Server2005 :
DbSession.Default.From
.Page(10, 2)
.OrderBy(Produits._.UnitPrice.Desc)
//.Où(Produits._.CategoryID == 2)
.ToList(); Le code est toujours le même que dans l'exemple ci-dessus, et le SQL généré est :
Texte : SELECT * FROM ( SELECT *,row_number() over( ORDER BY [Products].[UnitPrice] DESC) AS tmp__rowid FROM [Products] ) AS tmp_table WHERE (tmp__rowid BETWEEN 11 AND 20) L'appel de méthode est toujours le même, donc si le paramètre startIndex de from est égal à 1, top est toujours utilisé en premier et row_numer() n'est pas utilisé.
Bien sûr, si vous pensez que la pagination n’est pas assez idéale, vous pouvez écrire vous-même du SQL ou des procédures stockées.