Wenn Sie versuchen, eine kurze Antwort auf Ihre Zweifel zu geben, verwendet skip(n).take(m)
Ihre Abfrage die Select ROW_NUMBER() Over ...
Anweisung , wenn Sie die Methoden unter linq ausführen (mit SQL 2005/2008 als Datenbankserver) , wobei es sich um ein direktes Paging in der SQL-Engine handelt.
Als Beispiel habe ich eine DB-Tabelle namens mtcity
und habe die folgende Abfrage geschrieben (arbeite auch mit linq to entity):
using (DataClasses1DataContext c = new DataClasses1DataContext())
{
var query = (from MtCity2 c1 in c.MtCity2s
select c1).Skip(3).Take(3);
//Doing something with the query.
}
Die resultierende Abfrage lautet:
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]
Das ist ein Fensterdatenzugriff (ziemlich cool, übrigens, weil er von Anfang an Daten zurückgibt und auf die Tabelle zugreift, solange die Bedingungen erfüllt sind). Dies wird sehr ähnlich sein zu:
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
Mit der Ausnahme, dass diese zweite Abfrage schneller als das linq-Ergebnis ausgeführt wird, da ausschließlich der Index zum Erstellen des Datenzugriffsfensters verwendet wird. Dies bedeutet, wenn Sie eine Filterung benötigen, sollte die Filterung in der Entitätsliste (wo die Zeile erstellt wird) sein (oder müssen) und einige Indizes sollten ebenfalls erstellt werden, um die gute Leistung aufrechtzuerhalten.
Was ist besser?
Wenn Ihre Logik einen ziemlich soliden Workflow enthält, ist die Implementierung der richtigen SQL-Methode kompliziert. In diesem Fall ist LINQ die Lösung.
Wenn Sie diesen Teil der Logik direkt in SQL (in einer gespeicherten Prozedur) senken können, ist dies sogar noch besser, da Sie die zweite Abfrage, die ich Ihnen gezeigt habe (mithilfe von Indizes), implementieren und SQL erlauben können, den Ausführungsplan des zu generieren und zu speichern Abfrage (Verbesserung der Leistung).