我使用RavenDB存儲事件集合。這些事件有一個我正在使用的日期分組日期(DateTime.Date)。我試圖按小時添加一些統計信息,但我似乎無法找到一種乾淨利落的方法。使用RavenDB索引按小時計數
簡單的方法:
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)'有一些無效參數 Line 201,Position 72:Error CS1503 - 參數2:無法從'System.Func'轉換爲'System.Func' Line 201,Position 106:Error 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條記錄加載,我的理解是更大但更少的索引是最好的),會更好嗎?
記錄爲[RavenDB-1461](http://issues.hibernatingrhinos.com/issue/RavenDB-1461) –
完美,謝謝你。這是一個巨大的改進,我可以處理客戶端丟失的時間。 – mfanto