ページングについては、これまでのいくつかのセクションの例で登場しましたが、ここで詳しく説明します。
これを実現するには次の 3 つの方法があります。
1. Top(int topCount) メソッド
sqlserver と msaccess では実際には最上位にあり、Oracle では rownum を通じて実装されます。
2. From(int startIndex, int endIndex)
startIndex バーから endIndex バーまでのレコードの数。
3. ページ(int pageSize, int pageIndex)
ページあたりの pageSize、pageIndex
以下に、これら 3 つの方法の例を順番に示します。
上のメソッド:
DbSession.Default.From<製品>()
.トップ(10)
.ToList(); このクエリは、products テーブルの最初の 10 レコードをクエリします。生成される SQL ステートメントは次のとおりです。(表示コンポーネントによって生成される SQL を出力する方法)。
テキスト: [製品] からトップ 10 * を選択してください
メソッドから:
DbSession.Default.From<製品>()
.From(3, 8)
.ToList(); 項目 3 から項目 8 (項目 3 と 8 を含む) を検索します。 生成される SQL ステートメントは次のとおりです。
テキスト: SELECT * FROM ( SELECT TOP 6 * FROM ( SELECT TOP 8 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
ページメソッド:
DbSession.Default.From<製品>()
.Page(10, 2)
.ToList(); ページあたり 10 項目の 2 ページ目のデータをクエリします。 SQL ステートメントは次のとおりです。
テキスト: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
from メソッドと page メソッドによって生成される SQL ステートメントは同じ形式であることがわかります。実際、ページ メソッドは最終的に from メソッドを呼び出します。
from の startIndex パラメータが 1 に等しい場合、top メソッドが呼び出されてクエリが実行されます。
デフォルトでは、コンポーネントはソートを自動的に追加しません。主キーがある場合は、主キーのソートを選択します。それ以外の場合は、ソートする別の列を選択します。
もちろん、多くの場合、どの列を並べ替えるかを設定する必要があります。
例えば:
DbSession.Default.From<製品>()
.Page(10, 2)
.OrderBy(製品._.単価.説明)
.Where(製品._.カテゴリID == 2)
.ToList(); クエリ条件は、categoryid が 2 に等しく、単価で逆方向に並べ替えられ、ページごとに 2 ページに 10 個のデータがあることです。
生成される SQL は次のとおりです。
テキスト: SELECT * FROM ( SELECT TOP 2 * FROM [Products] WHERE [Products].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Products].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] DESC パラメーター: @bee7551993404c859 2f07f9b01710bb5[ Int32 ] = 2 この SQL ステートメントは予想外ですか? 条件を満たすクエリの 2 ページ目にはデータが 2 つしかないことがわかりました。そのため、クエリを実行するときは、unitprice を正の順序で上位 2 つを使用するだけで完了です。
条件を削除して見てみましょう。
DbSession.Default.From<製品>()
.Page(10, 2)
.OrderBy(製品._.単価.説明)
//.Where(Products._.CategoryID == 2)
.ToList(); 生成される SQL は次のとおりです。
テキスト: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [製品] ORDER BY [製品].[単価] DESC) AS tempIntable ORDER BY [単価] ASC) AS tempOuttable ORDER BY [単価] DESC これは通常の生成フォーマットが利用できるようになりました。
上記の SQL スクリプトはすべて SQL Server2000 で生成されます。
実際、クエリ処理中に、施設は条件を満たすレコードの count() 数も自動的にクエリするため、ビッグデータの場合、効率はあまり良くありません。
セットアップしたデータベースが SQL Server2005 の場合、count はクエリされませんが、効率を高めるために row_number() を通じて直接クエリされます。 (Oracle は rownum によって実装されます)
SQL Server2005 の例を次に示します。
DbSession.Default.From<製品>()
.Page(10, 2)
.OrderBy(製品._.単価.説明)
//.Where(Products._.CategoryID == 2)
コードは上記の例と同じで、生成される SQL は次のとおりです。
テキスト: SELECT * FROM ( SELECT *,row_number() over( ORDER BY [Products].[UnitPrice] DESC) AS tmp__rowid FROM [Products] ) AS tmp_table WHERE (tmp__rowid BETWEEN 11 AND 20) メソッド呼び出しは同じです。したがって、from のパラメータ startIndex が 1 に等しい場合でも、top が最初に使用され、row_numer() は使用されません。
もちろん、ページングが十分に理想的ではないと思われる場合は、SQL またはストアド プロシージャを自分で作成することもできます。