我使用.NET的可观察到/linq,我想做一个非常简单的事情。在我的应用中,我获得了媒体对象列表:
WebinarMedias = typesRepository.GetWebinarMedias();
这将是IObservable<IList<Media>>
。我们处于视图模型中,我将其传递给视图,该视图将进行订阅(在视图模型中创建时,这些是冷可观察的)。那里很好,视图想要媒体。
,但有时我有软件包:
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)));
我可以做foreach并肯定会使用更多的经典代码,但是我想保持可观察到的感冒,并保持价值从头到尾保持反应性。
我认为这是您需要的:
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;