Paging telah muncul pada contoh di beberapa bagian sebelumnya, dan sekarang kami akan menjelaskannya secara detail.
Ada tiga cara untuk mencapai hal ini:
1. Metode Teratas(int topCount).
Di sqlserver dan msaccess, ini sebenarnya teratas, dan di Oracle, ini diimplementasikan melalui rownum.
2. Dari(int indeks awal, int indeks akhir)
Jumlah catatan dari bilah startIndex hingga bilah endIndex.
3. Halaman(int ukuran halaman, int indeks halaman)
ukuran halaman per halaman, pageIndex
Di bawah ini adalah contoh dari ketiga metode tersebut secara bergantian.
metode teratas:
DbSession.Default.Dari
.Atas(10)
.ToList(); Kueri ini menanyakan 10 catatan pertama dalam tabel produk. Pernyataan sql yang dihasilkan adalah sebagai berikut: (Cara menampilkan sql yang dihasilkan oleh komponen tampilan)
Teks: PILIH 10 TERATAS * DARI [Produk]
dari metode:
DbSession.Default.Dari
.Dari(3, 8)
.ToList(); mencari data dari item 3 hingga item 8 (termasuk item 3 dan 8).
Teks: 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
metode halaman:
DbSession.Default.Dari
.Halaman(10, 2)
.ToList(); Kueri data di halaman 2 dari 10 item per halaman. Pernyataan sqlnya adalah sebagai berikut:
Teks: 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
Dapat dilihat bahwa pernyataan SQL yang dihasilkan oleh metode from dan metode halaman memiliki format yang sama. Faktanya, metode halaman pada akhirnya memanggil metode dari.
Jika parameter startIndex dari sama dengan 1, metode teratas akan dipanggil ke kueri.
Secara default, kami tidak mengatur pengurutan. Komponen akan secara otomatis menambahkan pengurutan. Jika ada kunci utama, pilih pengurutan kunci utama, jika tidak, pilih kolom lain untuk diurutkan.
Tentu saja, dalam banyak kasus kita perlu mengatur kolom mana yang akan diurutkan.
Misalnya:
DbSession.Default.Dari
.Halaman(10, 2)
.OrderBy(Produk._.UnitPrice.Desc)
.Where(Produk._.CategoryID == 2)
.ToList(); Syarat querynya adalah kategoriid sama dengan 2, diurutkan berdasarkan harga satuan mundur, dan ada 10 data di halaman 2 per halaman.
Sql yang dihasilkan adalah sebagai berikut:
Teks: SELECT * FROM ( SELECT TOP 2 * FROM [Produk] WHERE [Produk].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Produk].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] DESC Parameter: @bee7551993404c859 2f 07f9b01710bb5[ Int32 ] = 2 Apakah pernyataan sql ini tidak terduga? Ternyata halaman kedua query yang memenuhi syarat hanya memiliki 2 data, jadi saat query cukup gunakan unitprice dalam urutan positif atas 2 dan selesai.
Mari kita hilangkan kondisi tersebut dan lihat:
DbSession.Default.Dari
.Halaman(10, 2)
.OrderBy(Produk._.UnitPrice.Desc)
//.Dimana(Produk._.ID Kategori == 2)
.ToList(); Sql yang dihasilkan adalah sebagai berikut:
Teks: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Produk] ORDER BY [Produk].[UnitPrice] DESC) AS tempIntable ORDER BY [UnitPrice] ASC) AS tempOuttable ORDER BY [UnitPrice] DESC Ini adalah Format normal yang dihasilkan sekarang tersedia.
Skrip sql di atas semuanya dihasilkan di bawah sql server2000.
Faktanya, selama proses kueri, perusahaan juga akan secara otomatis menanyakan jumlah record () yang memenuhi ketentuan, sehingga dalam kasus data besar, efisiensinya tidak akan terlalu baik.
Jika database yang Anda siapkan adalah sql server2005, penghitungan tidak akan ditanyakan, tetapi akan ditanyakan langsung melalui row_number() untuk mendapatkan efisiensi yang lebih baik. (Oracle diimplementasikan dengan rownum)
Berikut adalah contoh sql server2005:
DbSession.Default.Dari
.Halaman(10, 2)
.OrderBy(Produk._.UnitPrice.Desc)
//.Dimana(Produk._.ID Kategori == 2)
.ToList(); Kodenya masih sama dengan contoh di atas, dan sql yang dihasilkan adalah:
Teks: 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) Pemanggilan metode masih sama, jadi jika parameter startIndex dari sama dengan 1, top tetap digunakan terlebih dahulu, dan row_numer() tidak digunakan.
Tentu saja, jika menurut Anda paging tidak cukup ideal, Anda dapat menulis sendiri SQL atau prosedur tersimpan.