我正在使用 RavenDB 来存储一系列事件。这些事件有一个我用来按天分组的日期 (DateTime.Date)。我正在尝试按小时添加一些统计信息,但我似乎无法找到一种干净的方法。
简单的方法:
public class DailyStats : AbstractIndexCreationTask<Incident, DateStat>
{
public DailyStats()
{
Map = docs => from doc in docs
select new
{
doc.OccuredOn,
Hour0 = doc.OccuredOn.Hour == 0 ? 1 : 0
Hour1 = doc.OccuredOn.Hour == 1 ? 1 : 0
//....
};
Reduce = mapped => from m in mapped
group m by new { m.Date.Date }
into g
select new
{
g.Key.Date,
Hour0 = g.Sum(x => x.Hour0),
Hour1 = g.Sum(x => x.Hour1)
//....
}
}
}
但这是可怕的重复。相反,我正在尝试使用字典:
public class DailyStats : AbstractIndexCreationTask<Incident, DateStat>
{
public DailyStats()
{
Map = docs => from doc in docs
select new
{
doc.OccuredOn,
IncidentsByHour = Enumerable.Range(0, 24).ToDictionary(h => h, h => doc.IncidentDate.Hour == h ? 1 : 0),
};
Reduce = mapped => from m in mapped
group m by new { m.Date.Date }
into g
select new
{
g.Key.Date,
IncidentsByHour = Enumerable.Range(0, 24).Select(h => g.Sum(x => x.IncidentsByHour[h])),
}
}
}
抛出异常:
第 201 行,位置 22:错误 CS1502 - 'System.Linq.Enumerable.ToDictionary(System.Collections.Generic.IEnumerable, System.Func, System.Collections.Generic.IEqualityComparer)' 的最佳重载方法匹配有一些无效参数行201,位置 72:错误 CS1503 - 参数 2:无法从 'System.Func' 转换为 'System.Func' 行 201,位置 106:错误 CS1503 - 参数 3:无法从 'System.Func' 转换为 'System.Collections .Generic.IEqualityComparer' 第 274 行,位置 22:错误 CS1928 - 'System.Collections.Generic.IEnumerable' 不包含 'Select' 的定义和最佳扩展方法重载 'System.Linq.Enumerable.Select(System.Collections .Generic.IEnumerable, System.Func)' 有一些无效参数第 274 行,第 54 位:错误 CS1503 - 参数 2:无法从 'System.Func' 转换为 'System.Func'
我不确定如何解决此异常,因为它发生在 Raven 方面。
按天分组的原因是我需要提取 365 天的统计数据,但仍然有一些按小时计算的基本信息。最好有两个索引,一个是天,一个是小时(总共加载 365 + 24 条记录。我的理解是更大但更少的索引是最好的)?