2017-12-12 38 views
0

私はそのようなクエリは、時間(SQL timeデータタイプではないdatetimeではない)、2時間間隔でグループ化されたいと思います。時間グループが事前に定義されていることを2時間間隔でLinqクエリグループにどのように

+---------------+-------+ 
| Time Group | Count | 
+---------------+-------+ 
| 00:01 - 02:00 |  3 | 
| 02:01 - 04:00 |  5 | 
| 04:01 - 06:00 |  8 | 
| ...   | ... | 
| 22:01 - 24:00 |  2 | 
+---------------+-------+ 

注:

例えば、結果はこのようなものになるだろう。 私はこのような単純なクエリ持って管理:

var temp = from a in myTable select a; 
var result0To2 = temp.Where(a => a.activityTime.Hours > 0 && a.activityTime.Hours <= 2).Count(); 
var result2To4 = temp.Where(a => a.activityTime.Hours > 2 && a.activityTime.Hours <= 4).Count(); 
var result4To6 = temp.Where(a => a.activityTime.Hours > 4 && a.activityTime.Hours <= 6).Count(); 
... 
... 
var result20To24 = temp.Where(a => a.activityTime.Hours > 22 && a.activityTime.Hours <= 24).Count(); 

私は動作するはずだと思います。しかし、より良い方法がありますか?

答えて

1

ここではテストプログラムを実行しました。具体的な要件に基づいてコードを適合させることができます。 LINQのGroupBy()述語を使用しており、完全にthis answer to a similar questionに基づいています(分単位ではなく時間単位に変更しました)。

public class Temp 
{ 
    public DateTime activityTime { get; set; } 
    public object item_info { get; set; } 
} 

もちろん、自分のクラスを使用することができます。私はテストのためだけです。

List<Temp> items = new List<Temp>  //populate with dummy data 
{ 
    new Temp { activityTime = DateTime.Parse("2017-12-11 11:43:00"), item_info = "something1" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 11:46:00"), item_info = "something2" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 11:57:00"), item_info = "something3" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 12:02:00"), item_info = "something4" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 12:04:00"), item_info = "something5" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 12:06:00"), item_info = "something6" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 12:58:00"), item_info = "something7" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 13:05:00"), item_info = "something8" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 13:29:00"), item_info = "something9" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 14:53:00"), item_info = "something10" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 14:55:00"), item_info = "something11" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 14:59:00"), item_info = "something12" }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 14:59:00"), item_info = 13 }, 
    new Temp { activityTime = DateTime.Parse("2017-12-11 15:26:00"), item_info = 15 } 
}; 

var groups = items.GroupBy(x => 
{ 
    var stamp = x.activityTime; 
    stamp = stamp.AddMinutes(-(stamp.Minute)); 
    stamp = stamp.AddMilliseconds(-stamp.Millisecond - 1000 * stamp.Second); 
    return stamp; 
}) 
.Select(g => new { TimeGroup = g.Key.ToString("h tt") + " - " + g.Key.AddHours(1).ToString("h tt"), Value = g.Count() }) 
.ToList(); 

グルーピングを変更するには、GroupBy()述語を変更します。

TimeGroup変数を使用すると、(日付の書式設定を必要とするか、「午前2時01分 - 午前4時00」を持つために、あなたのケースのように1分を追加することができますどのような表示に基づいて変更することができます。

の間隔のために2時間:

var groups = items.GroupBy(x => 
{ 
    var stamp = x.activityTime; 
    stamp = stamp.AddHours(-(stamp.Hour % 2)); 
    stamp = stamp.AddMinutes(-(stamp.Minute)); 
    stamp = stamp.AddMilliseconds(-stamp.Millisecond - 1000 * stamp.Second); 
    return stamp; 
}) 
.Select(g => new { TimeGroup = g.Key.ToString("h tt") + " - " + g.Key.AddHours(2).ToString("h tt"), Value = g.Count() }) 
.ToList(); 

警告、この操作は、より大きなデータセットの時間重であってもよい

関連する問題