查询嵌套的IColletion时,RX Extension ToObservable()会产生异常

时间:2016-12-06 13:14:50

标签: entity-framework linq system.reactive observable

我只是想尝试使用ef和rx。不幸的是,我遇到了一个我无法解决的问题。我有一个名为world.sql的MySQL测试数据库。 EF产生了以下

public worldEntities()
        : base("name=worldEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<city> city { get; set; }
    public virtual DbSet<country> country { get; set; }
    public virtual DbSet<countrylanguage> countrylanguage { get; set; }

我现在正在尝试比较“简单”的Linq查询和Rx提供的ToObservable()替代方案。使用Linq我有以下查询:

var m = new worldEntities();
        var res = m.country.Where(e => e.countrylanguage.Any(i=>i.Language.Equals("German"))).Select(e => e.Name);

然而,我无法弄清楚Rx对应物。如果我尝试使用相同的方法

var set = m.country.ToObservable();
        set.Where(e => e.countrylanguage.Any(i => i.Language.Equals("German")))
            .Select(e => e.Name).Buffer(50).
            Subscribe(l=>
            Items.AddRange(l));

我将收到以下内部消息的异常:

{"There is already an open DataReader associated with this Connection which must be closed first."}

所以我的问题是,RX查询应该如何,以达到相同的效果。

提前致谢并致以亲切的问候。

2 个答案:

答案 0 :(得分:1)

可能这样的事情应该有效:

    var set = m
.country
.Where(e => e.countrylanguage.Any(i => i.Language.Equals("German")))
.Select(e => e.Name)
.ToObservable();
            set.Buffer(50).
                Subscribe(l=>
                Items.AddRange(l));

然而,对于RX扩展来说这是非常不寻常的应用,并且绝对不是“适应”的最佳选择。

答案 1 :(得分:1)

数据库是基于拉取的系统。您请求从数据库中提取数据。 Rx完全是关于处理推送请求,而不是拉取请求。这不是Rx的好用。

如果您想学习Rx,请开始使用它进行事件处理。