动态连接可观察量

时间:2017-11-29 10:25:15

标签: c# linq observable system.reactive

我使用.NET的observables / LINQ,我想做一件非常简单的事情。在我的应用程序中,我获得了Media对象的列表:

WebinarMedias = typesRepository.GetWebinarMedias();

这将是IObservable<IList<Media>>。我们在视图模型中,将其传递给视图,该视图将执行订阅(这些是在视图模型中创建时的冷可观察对象)。 在那里,没关系,这个观点想要媒体。

但有时候我有 Packages

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

从套餐中,我可以获得媒体:

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

我想要的东西:在视图模型中,获取包,缩小到它们包含在一个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并使用更经典的代码,但是我希望保持冷静观察并保持端到端的反应值。

1 个答案:

答案 0 :(得分: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;