ホームページ >データベース >mysql チュートリアル >LINQ の Skip()/Take() とカスタム SQL: どちらのページング方法がより効率的ですか?
効率的なページングの実装: LINQ の Skip()/Take() とカスタム SQL の効率の比較
ページネーションの実装では、LINQ の Skip()
メソッドと Take()
メソッドとカスタム SQL ページング スキームのどちらかを選択する必要がある場合があります。この記事では、最良の決定を下せるよう、両方の方法の効率と利点を分析します。
LINQ の Skip() メソッドと Take() メソッド
LINQ は、単純なページング実装を提供します。 Skip()
メソッドで指定した行数をスキップし、その後の指定した行数をTake()
メソッドで取得することで簡単にページングを実現できます。 SQL Server 2008 以降では、これらのメソッドは ROW_NUMBER()
関数を利用して SQL エンジン内で直接ページングを実行します。
たとえば、次の LINQ クエリ:
<code class="language-csharp">var query = (from c1 in c.MtCity2s select c1).Skip(3).Take(3);</code>
は次の SQL ステートメントに変換されます:
<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>
このクエリは、SQL のウィンドウ データ アクセス方法を示しています。この方法では、すぐにデータの返しを開始し、指定された条件に基づいてテーブルへのアクセスを継続できます。
カスタマイズされた SQL ページングの実装
もう 1 つのアプローチは、カスタム SQL ベースのページング メカニズムを作成することです。パフォーマンスを向上させるために、ストアド プロシージャを使用してロジックをカプセル化し、必要に応じてインデックスを活用できます。例は次のとおりです:
<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>
このクエリは、mtcity
テーブル内の各行の行番号を含む CityEntities という名前のメモリ内テーブルを作成します。 CodCity
列のインデックスを使用すると、クエリで必要な行を効率的に取得できます。
最も効果的な方法を選択してください
これら 2 つの方法のどちらを選択するかは、ロジックの複雑さに大きく依存します。ワークフローが比較的単純な場合は、LINQ アプローチで十分です。ただし、より複雑なロジックの場合は、独自の SQL ベースのページング ソリューションを実装する方が効率的で柔軟な場合があります。
以上がLINQ の Skip()/Take() とカスタム SQL: どちらのページング方法がより効率的ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。