2017-11-29 18 views
1

私は.NETのobservables/LINQを使用しています。observablesを動的に連結する

WebinarMedias = typesRepository.GetWebinarMedias(); 

これはIObservable<IList<Media>>次のようになります。私のアプリでは、私は、メディアオブジェクトのリストを取得します。私たちはビュー・モデルに入っています。サブスクリプションを行うビュー(ビュー・モデルで作成された場合はコールド・オブザーバビリティ)をビューに渡します。 それはうまくいきます、その見解はMediasを望んでいます。

しかし、時には、私はパッケージあります取得するには、ビューモデルに:

packagesRepository.GetPackageMedias(package.Id) // IObservable<IList<Media>> 

私が欲しいもの:パッケージから

typesRepository.GetMonthlyFocusPackages() // IObservable<IList<Package>> 

を、私はメディアシュを得ることができます1つのIObservable<IList<Media>>変数に含めるすべてのメディアのリストに縮小し、ビューに表示する。より視覚的に

:そのような

input = [package 1 { media 1, media 2 }, package 2 { media 3 }] 
output = [media 1, media 2, media 3] 

何か:

var allMedias = typesRepository.GetMonthlyFocusPackages() 
    .SomeMagicSelect(packages => packages.Select(p => packagesRepository.GetPackageMedias(p.Id))); 

私はforeachesを行うと、確かに多くの古典的なコードを使用しますが、私が観察寒さを維持し、価値を維持したいことができエンドからエンドまで反応する。

答えて

3

私は、これは何が必要だと思う:

IObservable<IList<Media>> query = 
(
    from packages in typesRepository.GetMonthlyFocusPackages() 
    from package in packages.ToObservable() 
    from medias in typesRepository.GetPackageMedias(package.Id) 
    from media in medias.ToObservable() 
    select media 
).ToList(); 

それらが計算されているとして、それがより均一な方法であなたの結果が得られるよう、私は、しかし、これを行うことをお勧めします:あなたのための

IObservable<Media> query = 
    from packages in typesRepository.GetMonthlyFocusPackages() 
    from package in packages.ToObservable() 
    from medias in typesRepository.GetPackageMedias(package.Id) 
    from media in medias.ToObservable() 
    select media; 
+0

感謝を答えは、これは観察可能なことを破るようだ.Subscribe()はもはや効果がない(私はデータを受け取らない)。 はまた、発現の最終的な署名は、私は 'のIList '(MEDIASのリストの観察ではなく、マスコミの観察)を期待 'Media'あります。 –

+0

@MorganTouvereyQuilling - 私はあなたが最初の 'IObservable >'を求めクエリを与えたが、私は結果を提供するためのより良い方法として、2番目のクエリ 'IObservable 'をお勧めします。そのようにしたくない場合は、2番目のクエリを無視してください。 – Enigmativity

+0

@MorganTouvereyQuilling - どのように 'typesRepository'オブジェクトをインスタンス化していますか?それは 'IDisposable'ですか?あなたの質問にそのコードを表示できますか? – Enigmativity

関連する問題