2016-12-06 7 views
0

私はちょうどefとrxの使用に慣れようとしています。残念ながら、私は解決できない問題に遭遇しました。私はworld.sqlと呼ばれるMySQL用のテストデータベースを持っています。 EFは以下を生成しましたRXエクステンションToObservable()はネストされたIColletionを照会する際に例外を発生させます

public worldEntities() 
     : base("name=worldEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public virtual DbSet<city> city { get; set; } 
    public virtual DbSet<country> country { get; set; } 
    public virtual DbSet<countrylanguage> countrylanguage { get; set; } 

私は今、Rxが提供する "単純な" LinqクエリとToObservable()代替を比較しようとしていました。

var m = new worldEntities(); 
     var res = m.country.Where(e => e.countrylanguage.Any(i=>i.Language.Equals("German"))).Select(e => e.Name); 

しかし、私は受信の対応を把握することはできません。LINQのを使用して、私は作品次のクエリを持っています。私は同じアプローチに

var set = m.country.ToObservable(); 
     set.Where(e => e.countrylanguage.Any(i => i.Language.Equals("German"))) 
      .Select(e => e.Name).Buffer(50). 
      Subscribe(l=> 
      Items.AddRange(l)); 

を使用してみた場合、私は、次の内部のメッセージで例外が発生します:

{"There is already an open DataReader associated with this Connection which must be closed first."} 

だから私の質問は、どのようにRXのクエリは同じ結果を達成するために、のようになりますされます。

ありがとうございました。

答えて

1

おそらくそのような何かが動作するはずです:

var set = m 
.country 
.Where(e => e.countrylanguage.Any(i => i.Language.Equals("German"))) 
.Select(e => e.Name) 
.ToObservable(); 
      set.Buffer(50). 
       Subscribe(l=> 
       Items.AddRange(l)); 

それは間違いなく「慣れる」ための最良のものではないRXの拡張のための非常に珍しいのアプリケーションです。しかし。

+0

ありがとうございました。しかし、あなたはそれがデータベースに対してRXを使用するのは異常なケースだと私はなぜ説明してください?この[link](http://www.aboutmycode.com/reactive-extensions/using-reactive-extensions-for-streaming-data-from-database/)によれば、Rxは多くのことを単純化することができます。特に、UI要素チャンクワイズ。あなたの例から学んだことは、次のとおりです。最初にlinqToSQLクエリを作成し、EFにその魔法をさせ、後で結果をIObservableに変換します。それがスタンダードのアプローチですか?再度、あなたの素早い返答に感謝します。 – Akku

+0

AFAIK Rxはデータをプッシュするアクティブなソースに基づいている必要がありますが、あなたのアプローチではそうではありません。アクティブソースは、定期的なポーリングDBに基づいて変更を行い、それをプッシュすることができますが、DBへの単一のクエリでは実行できません。 –

1

データベースはプルベースのシステムです。データベースからデータを取得するように要求します。 Rxはプルリクエストではなく、プッシュリクエストを処理することに関するものです。これはRxの使い方ではありません。

Rxを学びたい場合は、Rxをイベント処理に使用してください。

関連する問題