2017-11-29 5 views
1

Ich benutze .NET Observables/LINQ und ich möchte eine ziemlich einfache Sache tun. In meiner app, erhalte ich Listen von Medienobjekten:Observable dynamisch verketten

WebinarMedias = typesRepository.GetWebinarMedias(); 

Dies wird eine IObservable<IList<Media>> sein. Wir befinden uns in einem Ansichtsmodell, das ich an eine Ansicht weitergebe, die die Subskription übernimmt (dies sind kalte Observablen, wenn sie im Ansichtsmodell erstellt werden). Da ist es gut, die Aussicht will Medien.

Aber manchmal habe ich Pakete:

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

aus einem Paket, das kann ich Medias erhalten:

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

Was ich will: in dem View-Modell erhalten Pakete, reduzieren Sie auf eine Liste aller Medien, die sie in einer IObservable<IList<Media>> Variable enthalten, und zeigen Sie sie in der Ansicht an .

Mehr optisch:

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

So etwas:

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

Ich kann foreaches tun und mehr klassischen Code sicher benutzen, aber ich mag die beobachtbaren kalt halten und den Wert zu halten reaktiv von Ende zu Ende.

Antwort

3

Ich denke, das ist, was Sie brauchen:

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(); 

ich dies empfehle, aber, wie es Sie führt zu einer gleichmäßigeren Art und Weise gibt, wie sie berechnet werden:

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

Vielen Dank für Ihre Antwort, aber dies scheint das Observable zu brechen, .Subscribe() hat keine Wirkung mehr (ich erhalte keine Daten). Die letzte Signatur des Ausdrucks ist 'Media', wo ich' IList '(eine beobachtbare Liste von Medien, keine beobachtbare Medien) erwarten würde. –

+0

@MorganTouvereyQuilling - Ich gab Ihnen die Abfrage, die Sie zuerst gefragt "IObservable >", aber ich empfahl die zweite Abfrage "IObservable " als eine bessere Möglichkeit, die Ergebnisse zur Verfügung zu stellen. Ignorieren Sie einfach die zweite Frage, wenn Sie das nicht möchten. – Enigmativity

+0

@MorganTouvereyQuilling - Wie instanziieren Sie Ihr 'typesRepository' Objekt? Ist es "IDisposable"? Können Sie diesen Code bitte in Ihrer Frage zeigen? – Enigmativity

Verwandte Themen