Paging wurde bereits in mehreren vorherigen Abschnitten anhand von Beispielen erläutert, und wir werden es nun ausführlich erläutern.
Es gibt drei Möglichkeiten, dies zu erreichen:
1. Top(int topCount)-Methode
In sqlserver und msaccess ist es tatsächlich top, und in Oracle wird es über rownum implementiert.
2. From(int startIndex, int endIndex)
Die Anzahl der Datensätze von der startIndex-Leiste bis zur endIndex-Leiste.
3. Seite(int pageSize, int pageIndex)
Seitengröße pro Seite, Seitenindex
Nachfolgend finden Sie Beispiele für diese drei Methoden.
Top-Methode:
DbSession.Default.From
.Top(10)
.ToList(); Diese Abfrage fragt die ersten 10 Datensätze in der Produkttabelle ab. Die generierte SQL-Anweisung lautet wie folgt: (Wie wird die von der Anzeigekomponente generierte SQL ausgegeben?)
Text: TOP 10 * AUS [Produkten] AUSWÄHLEN
aus Methode:
DbSession.Default.From
.Von(3, 8)
.ToList(); sucht nach Daten von Punkt 3 bis Punkt 8 (einschließlich Punkt 3 und 8). Die generierte SQL-Anweisung lautet wie folgt:
Text: SELECT * FROM ( SELECT TOP 6 * FROM ( SELECT TOP 8 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
Seitenmethode:
DbSession.Default.From
.Seite(10, 2)
.ToList(); Fragen Sie die Daten auf Seite 2 von 10 Elementen pro Seite ab.
Text: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
Es ist ersichtlich, dass die von der From-Methode und der Page-Methode generierten SQL-Anweisungen dasselbe Format haben. Tatsächlich ruft die Page-Methode letztendlich die From-Methode auf.
Wenn der startIndex-Parameter von from gleich 1 ist, wird die oberste Methode zur Abfrage aufgerufen.
Standardmäßig legen wir keine Sortierung fest. Die Komponente fügt automatisch eine Sortierung hinzu. Wenn ein Primärschlüssel vorhanden ist, wählen Sie die Primärschlüsselsortierung.
Natürlich müssen wir in vielen Fällen festlegen, welche Spalten sortiert werden sollen.
Zum Beispiel:
DbSession.Default.From
.Seite(10, 2)
.OrderBy(Products._.UnitPrice.Desc)
.Where(Products._.CategoryID == 2)
.ToList(); Die Abfragebedingung ist, dass die Kategorie-ID gleich 2 ist, rückwärts sortiert nach Einheitspreis und auf Seite 2 pro Seite 10 Daten vorhanden sind.
Die generierte SQL lautet wie folgt:
Text: SELECT * FROM ( SELECT TOP 2 * FROM [Products] WHERE [Products].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Products].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] DESC Parameter: @bee7551993404c859. 2f07 f9b01710bb5[ Int32 ] = 2 Ist diese SQL-Anweisung unerwartet? Es stellt sich heraus, dass die zweite Seite der Abfrage, die die Bedingungen erfüllt, nur zwei Daten enthält. Verwenden Sie also bei der Abfrage einfach den Einheitspreis in positiver Reihenfolge oben 2 und fertig.
Lassen Sie uns die Bedingung entfernen und einen Blick darauf werfen:
DbSession.Default.From
.Seite(10, 2)
.OrderBy(Products._.UnitPrice.Desc)
//.Where(Products._.CategoryID == 2)
.ToList(); Die generierte SQL lautet wie folgt:
Text: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[UnitPrice] DESC) AS tempIntable ORDER BY [UnitPrice] ASC) AS tempOuttable ORDER BY [UnitPrice] DESC Das ist Das normal generierte Format ist jetzt verfügbar.
Die oben genannten SQL-Skripte werden alle unter SQL Server2000 generiert.
Tatsächlich fragt die Einrichtung während des Abfragevorgangs auch automatisch die Anzahl der Datensätze mit count() ab, die die Bedingungen erfüllen, sodass die Effizienz bei Big Data nicht sehr gut ist.
Wenn es sich bei der von Ihnen eingerichteten Datenbank um SQL Server2005 handelt, wird die Anzahl nicht abgefragt, sondern direkt über row_number() abgefragt, um eine bessere Effizienz zu erzielen. (Oracle wird von rownum implementiert)
Hier ist ein Beispiel für SQL Server2005:
DbSession.Default.From
.Seite(10, 2)
.OrderBy(Products._.UnitPrice.Desc)
//.Where(Products._.CategoryID == 2)
.ToList(); Der Code ist immer noch derselbe wie im obigen Beispiel und die generierte SQL lautet:
Text: 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) Der Methodenaufruf ist immer noch derselbe, Wenn also der Parameter startIndex von from gleich 1 ist, wird top immer noch zuerst verwendet und row_numer() wird nicht verwendet.
Wenn Sie der Meinung sind, dass Paging nicht ideal genug ist, können Sie natürlich selbst SQL oder gespeicherte Prozeduren schreiben.