Mencoba memberikan jawaban singkat atas keraguan Anda, jika Anda menjalankan skip(n).take(m)
metode di linq (dengan SQL 2005/2008 sebagai server database) kueri Anda akan menggunakan Select ROW_NUMBER() Over ...
pernyataan tersebut, dengan paging langsung di mesin SQL.
Memberi Anda contoh, saya memiliki tabel db yang dipanggil mtcity
dan saya menulis kueri berikut (bekerja juga dengan linq ke entitas):
using (DataClasses1DataContext c = new DataClasses1DataContext())
{
var query = (from MtCity2 c1 in c.MtCity2s
select c1).Skip(3).Take(3);
//Doing something with the query.
}
Kueri yang dihasilkan adalah:
SELECT [t1].[CodCity],
[t1].[CodCountry],
[t1].[CodRegion],
[t1].[Name],
[t1].[Code]
FROM (
SELECT ROW_NUMBER() OVER (
ORDER BY [t0].[CodCity],
[t0].[CodCountry],
[t0].[CodRegion],
[t0].[Name],
[t0].[Code]) AS [ROW_NUMBER],
[t0].[CodCity],
[t0].[CodCountry],
[t0].[CodRegion],
[t0].[Name],
[t0].[Code]
FROM [dbo].[MtCity] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
Yang merupakan akses data berjendela (cukup keren, btw cuz akan mengembalikan data sejak awal dan akan mengakses tabel selama kondisi terpenuhi). Ini akan sangat mirip dengan:
With CityEntities As
(
Select ROW_NUMBER() Over (Order By CodCity) As Row,
CodCity //here is only accessed by the Index as CodCity is the primary
From dbo.mtcity
)
Select [t0].[CodCity],
[t0].[CodCountry],
[t0].[CodRegion],
[t0].[Name],
[t0].[Code]
From CityEntities c
Inner Join dbo.MtCity t0 on c.CodCity = t0.CodCity
Where c.Row Between @p0 + 1 AND @p0 + @p1
Order By c.Row Asc
Dengan pengecualian, query kedua ini akan dieksekusi lebih cepat daripada hasil linq karena akan menggunakan indeks secara eksklusif untuk membuat jendela akses data; ini berarti, jika Anda memerlukan beberapa pemfilteran, pemfilteran harus (atau harus) dalam daftar Entitas (tempat baris dibuat) dan beberapa indeks harus dibuat juga untuk menjaga kinerja yang baik.
Sekarang, apa yang lebih baik?
Jika Anda memiliki cukup banyak alur kerja yang solid dalam logika Anda, menerapkan cara SQL yang tepat akan menjadi rumit. Dalam hal ini LINQ akan menjadi solusinya.
Jika Anda dapat menurunkan bagian logika itu langsung ke SQL (dalam prosedur tersimpan), itu akan menjadi lebih baik karena Anda dapat mengimplementasikan kueri kedua yang saya tunjukkan (menggunakan indeks) dan mengizinkan SQL untuk menghasilkan dan menyimpan Rencana Eksekusi dari query (meningkatkan kinerja).