Essayer de vous donner une brève réponse à vos doutes, si vous exécutez l' skip(n).take(m)
méthodes sur linq (avec SQL 2005 / 2008 en tant que serveur de base de données) de votre recherche à l'aide de l' Select ROW_NUMBER() Over ...
déclaration, est en quelque sorte directe de pagination dans le moteur SQL.
Vous donner un exemple, j'ai une table db appelés mtcity
et j'ai écrit la requête suivante (travail aussi bien avec 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.
}
La requête sera:
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]
Qui est une fenêtre d'accès aux données (assez cool, btw cuz sera de retour les données depuis le début et accéder à la table aussi longtemps que les conditions sont remplies). Ce sera très similaire à:
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
Sauf que, cette deuxième requête sera exécutée plus rapidement que le linq résultat parce qu'il sera exclusivement à l'aide de l'index pour créer la fenêtre d'accès aux données, ce qui signifie, si vous avez besoin d'un filtrage, le filtrage doit être (ou doit être) dans l'Entité d'inscription (où la ligne est créée) et certains indices doivent être créés et à maintenir la qualité de la performance.
Maintenant, quoi de mieux?
Si vous avez beaucoup de solides flux de travail dans votre logique, la mise en œuvre de la bonne SQL chemin va être compliqué. Dans ce cas, LINQ sera la solution.
Si vous pouvez diminuer la partie de la logique directement en SQL (dans une procédure stockée), ce sera encore mieux parce que vous pouvez mettre en œuvre la deuxième requête que je vous ai montré (à l'aide d'indices) et permettre de SQL pour générer et stocker le Plan d'Exécution de la requête (amélioration des performances).