ホーム > Silverlight, WCF RIA Services > WCF RIA Services:ページングの追加

WCF RIA Services:ページングの追加

DataGridにページングを追加するのはとても簡単です。
まず、ツールボックスからDataPagerをドラッグ アンド ドロップして追加します。

DataPager

次にデータソースからPersonをDataPagerに対してドラッグ アンド ドロップします。

DataPagerとデータソースの関連付け

DataPagerのPageSizeプロパティを適当な値に設定します。
ここでは2にしてみました。
この状態で実行してみましょう。

実行結果

PageSizeで指定したとおり、2件のデータだけが表示されます。
ただ、次のページを表示させようとすると、エラーが表示されます。

エラー

どうもGetPersonメソッドに問題があるようです。
DomainService1クラスでデータを取り出すGetPersonメソッドを確認してみます。

    public IQueryable<Person> GetPerson()
    {
        return this.ObjectContext.Person;
    }

このとおりOrderByの指定がないので、エラーで要求されているようにこの指定を追加します。
id順に表示するようにしておきます。

    public IQueryable<Person> GetPerson()
    {
        return this.ObjectContext.Person.OrderBy(p => p.id);
    }

再度実行してみましょう。
今度はページの移動が可能です。

3ページ目を表示

ページングに関しては、実はこれだけの作業しかありません。
ただ、このページング、ページが遷移した際に必要なデータをとってきているのか、それともあらかじめすべてのデータをクライアント側に取り出していてそのデータをもとにページングを行っているのか、気になるところだと思います。
これを調べてみましょう。

DomainService1クラスにQueryメソッドを追加します。
QueryメソッドはDomainService1クラスの親のLinqToEntitiesDomainServiceクラスの親のDomainServiceクラスにviretualなメソッドとして定義されています。
このため、DomainService1クラス内でoverrideと入力し、スペースを押して表示されるインテリセンスからQueryメソッドを選択すれば、自動的に継承元のQueryメソッドを呼び出すための適切なソースが挿入されます。
このQueryメソッドにブレークポイントを設定して実行します。

初期表示時のクエリ

初期表示の場合、Queryメソッドには"Person[].Take(2)"というクエリが渡されていることがわかります。
これは最初の2件だけを取り出すLINQのクエリになります。
これが例えば3ページ目を表示する場合だと次のように変わります

3ページ目表示時のクエリ

"Person[].Skip(4).Take(2)"というのは最初から4つのデータ(2ページ分)をとばして、その次から2件取り出す、というクエリです。
OrderByを追加する前のエラーはこのSkipを実行しようとして発生したエラーでした。

この結果から、ページングではLINQを利用し、必要なデータだけを毎回取り出していることが確認できます。

なお、DataGridでは項目名をクリックすることでその項目での並べ替えが可能です。

年齢逆順ソート

こんな場合にどのようなクエリが実行されているのか、とか確認してみるのも面白いと思います。

カテゴリー:Silverlight, WCF RIA Services
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。