時間ごとにグループ化したい場合、フィールド "Call Time" はDateTime
フィールドです:
var groupQuery = from row in Foundrows.AsEnumerable()
let hour = row.Field<DateTime>("Call Time").Hour
group row by hour into hourGroup
select new {
CallHour = hourGroup.Key,
CallCount = hourGroup.Count()
};
Date
+の組み合わせでグループ化する場合Hour
:
var groupQuery = from row in Foundrows.AsEnumerable()
let date = row.Field<DateTime>("Call Time")
let hour = date.Hour
group row by new{ date, hour } into dateHourGroup
select new {
CallDate = dateHourGroup.Key.date,
CallHour = dateHourGroup.Key.hour,
CallCount = dateHourGroup.Count()
};
編集:それが実際にTimeSpan
(そうであるように)である場合は、lazyberezovskyのアプローチを使用してください:)
あなたのコメント:TryParse
の代わりに使用したい場合Parse
、コードにどのような変更を加える必要がありますか?
を返すことができる拡張機能を作成することをお勧めしますNullable<TimeSpan>
。次に、次のことを確認できますHasValue==true
。
public static TimeSpan? TryGetTimeSpan(this string tsString, string format = null)
{
TimeSpan ts;
bool success;
if (format == null)
success = TimeSpan.TryParse(tsString, out ts);
else
success = TimeSpan.TryParseExact(tsString, format, null, TimeSpanStyles.None, out ts);
return success ? (TimeSpan?)ts : (TimeSpan?)null;
}
これで、このクエリは効率的に機能し、文書化されていない副作用を (クエリでTimeSpan
使用するローカル変数として) 使用しなくなりました。TimeSpan.TryParse
var groupQuery = from r in Foundrows.AsEnumerable()
let time = r.Field<string>("CallTime").TryGetTimeSpan()
where time.HasValue
group r by time.Value.Hours into g
select new
{
Hrs = g.Key,
CallCount = g.Count()
};