かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

WCF RIA ServicesのメソッドをReactive Extensionsのメソッドチェインに入れるためのおまじない

こんなの用意しておけばいいかなぁ。

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.DomainServices.Client;

public static class DomainContextExtensions
{
    public static IObservable<IEnumerable<TEntity>> LoadAsObservable<TEntity>(this DomainContext ctx, EntityQuery<TEntity> query)
        where TEntity : Entity
    {
        var subject = new Subject<IEnumerable<TEntity>>();
        ctx.Load(query, op =>
        {
            if (op.HasError)
            {
                subject.OnError(op.Error);
            }
            else
            {
                subject.OnNext(op.Entities);
            }
        }, null);
        return subject.AsObservable();
    }
}

こんな風に使える。

Observable.FromEvent<MouseButtonEventArgs>(this, "MouseLeftButtonDown")
    .SelectMany(e => ctx.LoadAsObservable(ctx.GetPeopleQuery()))
    .Subscribe(people => people.Run(p => Debug.WriteLine(p)));

めもめも。
.