如何获得IObservable的Count

时间:2014-12-03 07:50:14

标签: c# linq system.reactive

我输了。

我尝试从长数据库记录流中获取一些聚合值(主要是Count)。我们过去习惯使用常规的linq,但是数据量已经很大,以适应内存。我想简单地将查询转换为IObservable以获得流媒体'结果。但我必须遗漏一些东西。大多数样本和文档似乎都没有考虑到这种情况。也许Rx不是正确的工具集。

因此,对于我的问题重复,我只是生成一些随机数据。然后我对它进行分组,并期望每组中的项目数量。

static void Main(string[] args)
{
    // lots of DB records; from IEnumerable to IObservable
    var records= //GetRecords();
    ///*
        Observable.Interval(TimeSpan.FromMilliseconds(11))
                     .Take(100)
                     .Select(i => new { Group = DateTime.Now.Millisecond % 10 });
    //*/
    var result = from r in records
                 group r by r.Group into g
                 select new
                 {
                     Key = g.Key,
                     Count = g.Count()
                 };

    foreach (var item in result.ToEnumerable())
    {
        Console.WriteLine("{0} - {1}", item.Key, item.Count.Wait());
    }
}

结果只会给我第一项的值:

8 - 12
4 - 0
0 - 0
5 - 0
1 - 0
7 - 0
2 - 0
3 - 0
9 - 0
6 - 0

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

Count()会返回IObservable<int>,并且您订阅的时间较晚,也就是说,当您观察到events的所有值时。我对Group的行为并不是100%肯定,但似乎您需要先订阅Count()以避免遗漏元素。将.ToTask()添加到.Count(),看看会发生什么。这样,调用Wait()毕竟是有意义的。