Implémentation efficace de la pagination : comparaison de l'efficacité de Skip()/Take() de LINQ et du SQL personnalisé
Dans votre implémentation de pagination, vous devrez peut-être choisir entre les méthodes Skip()
et Take()
de LINQ et un schéma de pagination SQL personnalisé. Cet article analysera l’efficacité et les avantages des deux méthodes pour vous aider à prendre la meilleure décision.
Méthodes Skip() et Take() de LINQ
LINQ fournit une implémentation de pagination simple. La méthode Skip()
ignore le nombre de lignes spécifié et la méthode Take()
obtient le nombre de lignes spécifié suivant, implémentant ainsi facilement la pagination. Dans SQL Server 2008 et versions ultérieures, ces méthodes exploitent la fonction ROW_NUMBER()
pour effectuer la pagination directement dans le moteur SQL.
Par exemple, la requête LINQ suivante :
<code class="language-csharp">var query = (from c1 in c.MtCity2s select c1).Skip(3).Take(3);</code>
sera converti en l'instruction SQL suivante :
<code class="language-sql">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]</code>
Cette requête illustre la méthode d'accès aux données fenêtrée de SQL, qui peut commencer à renvoyer des données immédiatement et continuer à accéder à la table en fonction de conditions spécifiées.
Implémentation de pagination SQL personnalisée
Une autre approche consiste à créer un mécanisme de pagination personnalisé basé sur SQL. Pour améliorer les performances, vous pouvez utiliser des procédures stockées pour encapsuler la logique et exploiter les index le cas échéant. Un exemple est le suivant :
<code class="language-sql">With CityEntities As ( Select ROW_NUMBER() Over (Order By CodCity) As Row, CodCity 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</code>
Cette requête crée une table en mémoire appelée CityEntities qui contient le numéro de ligne de chaque ligne de la table mtcity
. En utilisant un index sur la colonne CodCity
, la requête peut récupérer efficacement les lignes requises.
Choisissez la méthode la plus efficace
Le choix entre ces deux méthodes dépend en grande partie de la complexité de votre logique. Si votre flux de travail est relativement simple, l'approche LINQ suffira. Toutefois, pour une logique plus complexe, il peut être plus efficace et plus flexible d'implémenter votre propre solution de pagination basée sur SQL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!