我使用.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并使用更经典的代码,但是我希望保持冷静观察并保持端到端的反应值。
答案 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;