かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

検索系まとめ その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
    • 現在の変更と値を無視ってサーバの値で上書きする

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