Опитвам се да ви дам кратък отговор на вашето съмнение, ако изпълните skip(n).take(m)
методи на linq (с SQL 2005 / 2008 като сървър на база данни) вашата заявка ще използва Select ROW_NUMBER() Over ...
изявление, with е някак директно пейджинг в SQL машината.
Като ви давам пример, имам таблица с db, наречена mtcity
и написах следната заявка (работи и с linq to entities):
using (DataClasses1DataContext c = new DataClasses1DataContext())
{
var query = (from MtCity2 c1 in c.MtCity2s
select c1).Skip(3).Take(3);
//Doing something with the query.
}
Получената заявка ще бъде:
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]
Което е достъп до данни в прозорец (много готино, между другото, защото ще връща данни от самото начало и ще има достъп до таблицата, стига да са изпълнени условията). Това ще бъде много подобно на:
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
С изключение на това, че тази втора заявка ще бъде изпълнена по-бързо от резултата linq, защото ще използва изключително индекса за създаване на прозореца за достъп до данни; това означава, че ако имате нужда от филтриране, филтрирането трябва да бъде (или трябва да бъде) в списъка с обекти (където е създаден редът) и трябва да бъдат създадени някои индекси, за да поддържате доброто представяне.
Сега, какво е по-добре?
Ако имате доста стабилен работен поток във вашата логика, прилагането на правилния SQL начин ще бъде сложно. В този случай LINQ ще бъде решението.
Ако можете да намалите тази част от логиката директно до SQL (в съхранена процедура), ще бъде още по-добре, защото можете да приложите втората заявка, която ви показах (с помощта на индекси) и да позволите на SQL да генерира и съхранява плана за изпълнение на заявка (подобряване на производителността).