Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework RX扩展ToObservable()在查询嵌套ICollection时产生异常_Entity Framework_Linq_System.reactive_Observable - Fatal编程技术网

Entity framework RX扩展ToObservable()在查询嵌套ICollection时产生异常

Entity framework RX扩展ToObservable()在查询嵌套ICollection时产生异常,entity-framework,linq,system.reactive,observable,Entity Framework,Linq,System.reactive,Observable,我只是试着适应使用ef和rx。不幸的是,我遇到了一个我无法解决的问题。我有一个MySQL测试数据库,名为。EF产生了以下结果: public worldEntities() : base("name=worldEntities") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new Uninte

我只是试着适应使用ef和rx。不幸的是,我遇到了一个我无法解决的问题。我有一个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; }
然而,我无法找出对应的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查询应该是什么样子,才能获得相同的结果


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

类似的方式可能会奏效:

    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扩展来说,这是一个非常不寻常的应用程序,绝对不是“适应”的最佳应用程序。

可能类似的应用程序应该可以工作:

    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扩展来说,这是一个非常不寻常的应用程序,而且肯定不是“适应”的最佳应用程序。

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


如果您想学习Rx,请开始将其用于事件处理。

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


如果您想学习Rx,请开始将其用于事件处理。

谢谢,这很有效。然而,你能解释一下为什么你认为对数据库使用RX是一种不寻常的情况吗?根据这一点,Rx可以简化很多事情,特别是按块填充UI元素。所以我从你的例子中学到了以下几点。首先创建linqToSQL查询,让EF发挥其魔力,然后将结果转换为IObservable。这应该是斯坦德的方法吗?再次感谢您的快速回复。AFAIK Rx应该基于推送数据的活动源,这与您的方法不同。活动源代码可以基于定期轮询数据库以进行更改并将其推送到数据库上,但不能基于对数据库的单个查询。谢谢,这很有效。然而,你能解释一下为什么你认为对数据库使用RX是一种不寻常的情况吗?根据这一点,Rx可以简化很多事情,特别是按块填充UI元素。所以我从你的例子中学到了以下几点。首先创建linqToSQL查询,让EF发挥其魔力,然后将结果转换为IObservable。这应该是斯坦德的方法吗?再次感谢您的快速回复。AFAIK Rx应该基于推送数据的活动源,这与您的方法不同。活动源可以基于定期轮询数据库以获取更改并将其推送到数据库上,但不能基于对数据库的单个查询。