SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

ASP.NET 2.0でカスタムのページング処理と並び替えを併用する

動的SQLステートメントを作成して効率よく並べ替える

  • このエントリーをはてなブックマークに追加

カスタムのページング処理は、結果セットが大きい場合にアプリケーションのパフォーマンスを大幅に向上させることができますが、既定のページング処理に内在する昇順/降順の並べ替え機能が使えなくなってしまいます。本稿では、カスタムのページング処理と並べ替えの両方を利用する方法を解説します。

  • このエントリーをはてなブックマークに追加

はじめに

 先週の投稿「Custom Paging in ASP.NET 2.0 with SQL Server 2005」では、ASP.NET 2.0でカスタムのページング処理を適切に実装する方法と、型指定されたDataSet(Typed DataSet)ObjectDataSourceコントロール、SQL Server 2005の新しいROW_NUMBER()キーワードを使って大量のデータを効率良くページング処理する方法を紹介しました。カスタムのページング処理は、表示の必要があるレコードのサブセットのみをページごとに賢く取得するのに対し、既定のページング処理は、実装は簡単ですが、ページごとにすべてのレコードを取得するので、対象データがかなり多い場合はパフォーマンスが低下します。「Custom Paging in ASP.NET 2.0 with SQL Server 2005」で紹介した非科学的なテストでは、50,000件のレコードがあるデータベースで、既定のページング処理を指定すると各ページの表示に2秒かかったのに対し、カスタムのページング処理を指定すると各ページを0.03秒足らずで読み込むことができました。

 とはいえ、カスタムのページング処理にも問題はあります。カスタムのページング処理では、処理する結果が大きければパフォーマンスは驚くほど向上しますが、その分、実装が難しくなります。さらに、カスタムのページング処理を追加した場合は、結果の並べ替えを可能にする工夫をしなければなりません。本稿では、カスタムのページング処理を拡張して結果の昇順/降順の並べ替えのサポートを組み込む方法を説明します。それでは、始めましょう。

 なお、本稿に取り掛かる前に、「Custom Paging in ASP.NET 2.0 with SQL Server 2005」をお読みになることをお勧めします。

カスタムのページング処理と並べ替えを簡単に併用できない理由

 ASP.NET 1.xに比べて、ASP.NET 2.0では、主にGridViewASP.NET 1.x DataGridの2.0アップグレード版)のおかげでデータの表示と処理が非常に簡単になりました。SqlDataSourceをGridViewにバインドしている場合、あるいは、並べ替えをサポートするオブジェクト(厳密に型指定されたDataTableなど)を返すObjectDataSourceをGridViewにバインドしている場合に、GridViewで昇順/降順の並べ替えを利用するには、GridViewのスマートタグで[並べ替えを有効にする]チェックボックスをオンにするだけ(または、手動でAllowSortingプロパティをTrueに設定するだけ)です。コーディングは必要ありません。

 このようにチェックボックスをオンにするだけで済むというアプローチは、データがページング処理に対応していない場合や既定のページング処理を使う場合に、結果をObjectDataSourceにバインドするときには非常に便利です。しかし、カスタムのページング処理で期待どおりの並べ替えを行うためには、もう少し工夫が必要です。カスタムのページング処理を使う場合も、並べ替えをサポートするようにGridViewを設定でき、GridViewは忠実に列見出しをLinkButtonに変換します。ただし、列見出しをクリックしても、その列を基準に並べ替えられるのは現在表示されているデータだけです。

 分かりやすく説明しましょう。例えば、「Custom Paging in ASP.NET 2.0 with SQL Server 2005」で行ったように、カスタムのページング処理を使って「Employees」データベーステーブルから50,000件のレコードを表示するとします。ユーザーは、このデータの1ページ目を表示します。ここで思い出してください。既定では、グリッドは最初にEmployeeIDを基準に並べ替えられるので、50,000件のレコードのうち先頭の10人の従業員が表示されます。

 次に、この企業の最低給与はいくらかを調べたいので、Salary列の見出しのLinkButtonをクリックするとします。このクリックによってポストバックが発生し、ObjectDataSourceに対してデータの再クエリが実行されます。ObjectDataSourceは、ベースオブジェクトからデータを取得した後、そのデータを要求したデータWebコントロールにデータを返すまでの間に、厳密に型指定されたDataTableを、ID順に並べ替えた後の行のSortExpression値(この場合はSalary)に基づいて並べ替えます。

 問題がお分かりでしょうか。カスタムのページング処理では、表示する必要がある10人の従業員しか返されないので、ObjectDataSourceも1ページ目の同じ10人の従業員しか返しません。つまり、表示される結果は、1ページ目の10人の従業員を「Salary」列の昇順に並べ替えたものです。

 これを見る限りでは、Dave Johnsonの30,180ドルが最低給与のようですが、実際にはこの給与は1ページ目の従業員の中で一番低いだけに過ぎません(30,000ドルというもっと低い給与の従業員が7人います)。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
並べ替え後の正しいページを表示する

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Scott Mitchell(Scott Mitchell)

http://www.4guysfromrolla.com/ScottMitchell.shtml

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/360 2006/08/22 15:46

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング