Próbując dać ci krótką odpowiedź na twoje wątpliwości, jeśli wykonasz skip(n).take(m)
metody na linq (z SQL 2005/2008 jako serwerem bazy danych), twoje zapytanie będzie używać Select ROW_NUMBER() Over ...
instrukcji, z jakoś bezpośrednim stronicowaniem w silniku SQL.
Podając przykład, mam tabelę db o nazwie mtcity
i napisałem następujące zapytanie (działa również z linq do encji):
using (DataClasses1DataContext c = new DataClasses1DataContext())
{
var query = (from MtCity2 c1 in c.MtCity2s
select c1).Skip(3).Take(3);
//Doing something with the query.
}
Wynikowe zapytanie będzie wyglądać następująco:
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]
Jest to dostęp do danych w oknie (całkiem fajny, bo będzie zwracał dane od samego początku i będzie miał dostęp do tabeli, o ile zostaną spełnione warunki). Będzie to bardzo podobne do:
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
Z wyjątkiem tego, że to drugie zapytanie zostanie wykonane szybciej niż wynik linq, ponieważ będzie używał wyłącznie indeksu do tworzenia okna dostępu do danych; Oznacza to, że jeśli potrzebujesz filtrowania, filtrowanie powinno znajdować się (lub musi znajdować się) na liście jednostek (tam, gdzie tworzony jest wiersz), a także należy utworzyć kilka indeksów, aby utrzymać dobrą wydajność.
A co jest lepsze?
Jeśli masz dość solidną organizację pracy w swojej logice, implementacja właściwego sposobu SQL będzie skomplikowana. W takim przypadku LINQ będzie rozwiązaniem.
Jeśli możesz obniżyć tę część logiki bezpośrednio do SQL (w procedurze składowanej), będzie jeszcze lepiej, ponieważ możesz zaimplementować drugie zapytanie, które ci pokazałem (używając indeksów) i zezwolić SQL na wygenerowanie i przechowywanie planu wykonania zapytanie (poprawiające wydajność).