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

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

Barbara Streisand
リリース: 2025-01-11 09:51:44
オリジナル
787 人が閲覧しました

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 クエリ:

1

2

<code class="language-csharp">var query = (from c1 in c.MtCity2s

                select c1).Skip(3).Take(3);</code>

ログイン後にコピー

は次の SQL ステートメントに変換されます:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<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 ベースのページング メカニズムを作成することです。パフォーマンスを向上させるために、ストアド プロシージャを使用してロジックをカプセル化し、必要に応じてインデックスを活用できます。例は次のとおりです:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート