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 日分の統計を取得する必要があるためですが、時間ごとの基本的な情報もいくつかあります。代わりに、1 日ごとと 1 時間ごとの 2 つのインデックスを用意したほうがよいでしょうか (合計 365 + 24 レコードが読み込まれます。私の理解では、インデックスは大きくてもインデックスは少ない方が最適です)。