2016-12-06 23 views
0

我只是想使用ef和rx而感到舒服。不幸的是,我遇到了一个我无法解决的问题。我有一个名为world.sql的MySQL测试数据库。 EF制作了以下内容RX Extension ToObservable()在查询嵌套的IColletion时产生异常

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查询的样子,来达到同样的效果。

在此先感谢和亲切的问候。

回答

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扩展非常不寻常的应用程序,绝对不是最好的一个“得到舒服”。

+0

谢谢你,工作。但是,请你解释一下为什么你认为使用RX对数据库来说这是一个非常规的情况?根据这个[link](http://www.aboutmycode.com/reactive-extensions/using-reactive-extensions-for-streaming-data-from-database/)Rx可以简化很多事情,特别是填充UI元素块明智。所以我从你的例子中学到了以下内容。首先创建linqToSQL查询,并让EF做它的魔力,然后将结果转换为IObservable。这是否应该是莽撞方式?再次感谢您的快速回复。 – Akku

+0

AFAIK Rx的东西应该基于推动数据的主动源,这与你的方法不一样。活动源可以基于定期轮询数据库来进行更改并推送,但不会对数据库进行单个查询。 –

1

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

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