【问题标题】:Dynamically concatenate observables动态连接 observables
【发布时间】:2017-11-29 10:25:14
【问题描述】:

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

WebinarMedias = typesRepository.GetWebinarMedias();

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

但有时我有

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

从包中,我可以获得媒体:

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

我想要什么: 在视图模型中,获取包,简化为它们包含在一个 IObservable&lt;IList&lt;Media&gt;&gt; 变量中的所有媒体的列表,然后显示在视图中。

更直观:

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 并使用更经典的代码,但我想保持可观察的冷态并保持从头到尾的反应值。

【问题讨论】:

    标签: c# linq observable system.reactive


    【解决方案1】:

    我认为这是你需要的:

    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;
    

    【讨论】:

    • 感谢您的回答,但这似乎破坏了可观察性,.Subscribe() 不再有效(我没有收到任何数据)。此外,表达式的最终签名是Media,我希望IList&lt;Media&gt;(媒体列表的可观察对象,而不是媒体的可观察对象)。
    • @MorganTouvreyQuilling - 我给了你第一个查询IObservable&lt;IList&lt;Media&gt;&gt;,但我推荐第二个查询IObservable&lt;Media&gt; 作为提供结果的更好方法。如果您不希望这样,请忽略第二个查询。
    • @MorganTouvreyQuilling - 你是如何实例化你的typesRepository 对象的?是IDisposable吗?你能在你的问题中显示该代码吗?
    • 是的,我测试了第二个查询,并对其进行了调整:pastebin.com/UpHyG7Sc - 但它没有产生任何价值。我首先忽略了第一个查询,因为我认为 ToList() 会返回一个 IList 并使用 observable,但我看到这是一个返回 observable 的扩展方法。但在任何情况下,它们都不会产生值,而单独测试的存储库本身运行良好。
    • @MorganTouvreyQuilling - 您在 pastebin 中的查询类型为 IObservable&lt;IList&lt;Media&gt;&gt;,但我怀疑您的其他查询返回单个 IList&lt;Media&gt;,而 pastebin 查询将返回多个 IList&lt;Media&gt;。这就是你想要的吗?
    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2016-06-13
    • 2021-12-14
    相关资源
    最近更新 更多