かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

検索系まとめ その2

前回:検索系まとめ

前回で、サーバーサイドで検索系のメソッドをどうやって作るのかざっと見ました。
今回は、検索系のメソッドをSilverlight側でどうやって呼び出すかをまとめてみようと思います。

色々なケースに対応できるようにするためか、Silverlight側からは、若干色々な書き方が出来るようになっています。
実際に、実装してみたサンプルの記事では、EntityQueryを取得して、LINQで問い合わせ条件を指定して、DomainContextのLoadメソッドにEntityQueryと、コールバックを指定していました。個人的には、これが一番わかりやすいと思っています。

// 結果は、DomainContextのエンテティのコレクションに充填される
dataGrid.ItemsSource = _context.Employees;
_context.Load(query,
    // コールバックを指定するよ
    (result) =>
    {
        // 読み込み完了したら、操作可能な状態に戻す
        this.IsEnabled = true;
    }, null);

これのほかのバリエーションを見ていこうと思います。やり方に差があるのは、以下の2箇所です。

  1. 検索結果の受け取り方
    1. DomainContextのプロパティ(サンプルでやった方法)
    2. LoadOperationのEntitiesプロパティ
  2. 完了時の処理
    1. Loadメソッドの引数にコールバックを渡す(サンプルでやった方法)
    2. LoadOperationのCompletedイベントに登録する

サンプルでやっていないものを見ていこうと思います。

LoadOperationのEntitiesプロパティ

Loadメソッドの引数に渡すコールバックの第一引数は、LoadOperationです。なので、コールバックでEntitiesプロパティを介して、DataGridに表示データを渡すことが出来ます。

_context.Load(query, (result) =>
    {
        dataGrid.ItemsSource = result.Entities;
        this.IsEnabled = true;
    }, null);

LoadOperationのCompletedイベント

Loadメソッドの戻り値は、実はLoadOperation型になります。なので、Loadメソッドの後にCompletedイベントを登録します。

var operation = _context.Load(query);
operation.Completed += (s, evt) =>
    {
        this.IsEnabled = true;
    };
dataGrid.ItemsSource = operation.Entities;

MergeOption

最後に、LoadメソッドにはMergeOptionという型の引数を渡すことができるオーバーロードがあります。MergeOptionは、以下の3つの値を持つ列挙型で、引数に渡すことで、指定したマージ方式をとります。

  • KeepCurrentValues
    • 現在の値を保持
  • KeepChanges
    • 現在の編集内容を保持
  • OverwriteCurrentValues
    • 現在の変更と値を無視ってサーバの値で上書きする

ここらへんを呼び分けることで、色々細かな制御が出来るようになっています。