我输了。
我尝试从长数据库记录流中获取一些聚合值(主要是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
我在这里做错了什么?
答案 0 :(得分:1)
Count()
会返回IObservable<int>
,并且您订阅的时间较晚,也就是说,当您观察到events
的所有值时。我对Group
的行为并不是100%肯定,但似乎您需要先订阅Count()
以避免遗漏元素。将.ToTask()
添加到.Count()
,看看会发生什么。这样,调用Wait()
毕竟是有意义的。