データベースコンポーネントHxj.Data(20)(ページング)

5536 ワード

ページは前のセクションの列にすでに表示されていますが、詳しく説明します.
実現するには3つの方法があります.
1、Top(int topCount)方法
sqlserverとmsaccessでは実はtopであり、oracleではrownumによって実現される.
 
2、From(int startIndex, int endIndex)
startIndexバーからendIndexバーまでのレコード数.
 
3、Page(int pageSize, int pageIndex)
各ページpageSizeバー、第pageIndexページ
 
以下、この3つの方法を順に例に挙げて説明する.
 
トップメソッド:
DbSession.Default.From<Products>()
                .Top(10)
                .ToList();

このクエリではproductsテーブルの上位10レコードがクエリされ、生成されたsql文は次のようになります:(コンポーネント生成を表示するsqlを出力する方法)
Text: 
SELECT TOP 10 * FROM [Products]

 
 
fromメソッド:
DbSession.Default.From<Products>()
                .From(3, 8)
                .ToList();

3番目から8番目のデータ(3番目と8番目を含む)を検索し、生成されたsql文は次のようになります.
Text: 
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

 
 
Pageメソッド:
DbSession.Default.From<Products>()
                .Page(10, 2)
                .ToList();

各ページ10条の2ページ目のデータをクエリーします.sql文は次のとおりです.
Text: 
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文はフォーマットが同じであることがわかりますが、pageメソッドは最終的にfromメソッドを呼び出します.
fromのstartIndexパラメータが1に等しい場合、topメソッドが呼び出されてクエリーされます.
 
デフォルトではソートは設定されていません.コンポーネントは自動的にソートを追加し、プライマリ・キーがある場合はプライマリ・キー・ソートを選択します.そうでない場合は、他のカラム・ソートを選択します.
 
もちろん、多くの場合、どのカラムをソートするかを設定する必要があります.
例:
DbSession.Default.From<Products>()
                .Page(10, 2)
                .OrderBy(Products._.UnitPrice.Desc)
                .Where(Products._.CategoryID == 2)
                .ToList();

クエリー条件はcategoryidが2に等しく、unitpriceの逆説に従ってソートされ、1ページ10条の2ページ目のデータです.
生成されたsqlは次のとおりです.
Text: 
SELECT * FROM
( SELECT TOP 2 * FROM [Products] WHERE [Products].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Products].[UnitPrice] ASC)
AS temp_table ORDER BY [UnitPrice] DESC

Parameters:
@bee7551993404c8592f07f9b01710bb5[Int32] = 2
のようなsql文は意外ではないでしょうか.条件に合ったクエリーは2ページ目に2つのデータしかないので、クエリーのときはunitprice順top 2で終わります.
 
条件を外してみましょう.
DbSession.Default.From<Products>()
                .Page(10, 2)
                .OrderBy(Products._.UnitPrice.Desc)
                //.Where(Products._.CategoryID == 2)
                .ToList();

生成されたsqlは次のとおりです.
Text: 
SELECT * FROM
( SELECT TOP 10 * FROM
( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[UnitPrice] DESC)
AS tempIntable ORDER BY [UnitPrice] ASC)
AS tempOuttable ORDER BY [UnitPrice] DESC

これで正常な生成フォーマットです.
 
以上のsqlスクリプトは、いずれもsql server 2000で生成される.
 
実際にはクエリー中にcount()が条件に合致するレコード数を自動的にクエリーするので、ビッグデータの場合、効率はあまりよくありません.
 
作成したデータベースがsql server 2005である場合、countをクエリーするのではなくrow_を直接通過します.number()は、より効率的なクエリーを行います.(oracleはrownum実装)
 
次に、sql server 2005の例を示します.
DbSession.Default.From<Products>()
                .Page(10, 2)
                .OrderBy(Products._.UnitPrice.Desc)
                //.Where(Products._.CategoryID == 2)
                .ToList();

コードは上記の例のもので、生成されたsql:
Text: 
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やストレージプロセスを書くことができます.