データベースコンポーネント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つの方法を順に例に挙げて説明する.
トップメソッド:
このクエリではproductsテーブルの上位10レコードがクエリされ、生成されたsql文は次のようになります:(コンポーネント生成を表示するsqlを出力する方法)
fromメソッド:
3番目から8番目のデータ(3番目と8番目を含む)を検索し、生成されたsql文は次のようになります.
Pageメソッド:
各ページ10条の2ページ目のデータをクエリーします.sql文は次のとおりです.
fromメソッドとpageメソッドで生成されたsql文はフォーマットが同じであることがわかりますが、pageメソッドは最終的にfromメソッドを呼び出します.
fromのstartIndexパラメータが1に等しい場合、topメソッドが呼び出されてクエリーされます.
デフォルトではソートは設定されていません.コンポーネントは自動的にソートを追加し、プライマリ・キーがある場合はプライマリ・キー・ソートを選択します.そうでない場合は、他のカラム・ソートを選択します.
もちろん、多くの場合、どのカラムをソートするかを設定する必要があります.
例:
クエリー条件はcategoryidが2に等しく、unitpriceの逆説に従ってソートされ、1ページ10条の2ページ目のデータです.
生成されたsqlは次のとおりです.
条件を外してみましょう.
生成されたsqlは次のとおりです.
これで正常な生成フォーマットです.
以上のsqlスクリプトは、いずれもsql server 2000で生成される.
実際にはクエリー中にcount()が条件に合致するレコード数を自動的にクエリーするので、ビッグデータの場合、効率はあまりよくありません.
作成したデータベースがsql server 2005である場合、countをクエリーするのではなくrow_を直接通過します.number()は、より効率的なクエリーを行います.(oracleはrownum実装)
次に、sql server 2005の例を示します.
コードは上記の例のもので、生成されたsql:
メソッドの呼び出しは同じですので、fromのパラメータstartIndexが1に等しい場合、topを優先的に使用するかrow_を使用しません.numer().
もちろん、ページングはまだ理想的ではないと思います.自分でsqlやストレージプロセスを書くことができます.
実現するには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やストレージプロセスを書くことができます.