ホームページ >データベース >mysql チュートリアル >LINQ の Skip()/Take() とカスタム SQL: どちらのページング方法がより効率的ですか?

LINQ の Skip()/Take() とカスタム SQL: どちらのページング方法がより効率的ですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-11 09:51:44791ブラウズ

LINQ's Skip()/Take() vs. Custom SQL: Which Paging Method Offers Better Efficiency?

効率的なページングの実装: 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。