通常のSQLでは、次のようなことができます
SELECT * From T GROUP BY DATEPART(wk, T.Date)
Linq to SQL でそれを行うにはどうすればよいですか?
以下は動作しません
From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date)
また、動作しません:
From F In DB.T Group R By (F.Date.DayOfYear / 7)
通常のSQLでは、次のようなことができます
SELECT * From T GROUP BY DATEPART(wk, T.Date)
Linq to SQL でそれを行うにはどうすればよいですか?
以下は動作しません
From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date)
また、動作しません:
From F In DB.T Group R By (F.Date.DayOfYear / 7)
LINQ to SQLはCalendar.WeekOfYearメソッドをサポートしていませんが、 DatePart への呼び出しをラップする TSQL 関数を作成できる可能性があります。DayOfYear / 7 トリックは、ほとんどの場合に機能し、はるかに簡単に使用できます。これが私が最終的に得たコードです:
var x = from F in DB.T
group F by new {Year = F.Date.Year, Week = Math.Floor((decimal)F.Date.DayOfYear / 7)} into FGroup
orderby FGroup.Key.Year, FGroup.Key.Week
select new {
Year = FGroup.Key.Year,
Week = FGroup.Key.Week,
Count = FGroup.Count()
};
結果は次のようになります。
Year Week Count
2004 46 3
2004 47 3
2004 48 3
2004 49 3
2004 50 2
2005 0 1
2005 1 8
2005 2 3
2005 3 1
2005 12 2
2005 13 2
これは正しく動作します。
from F in DB.T group F by F.Date.DayOfYear / 7;
グループを間違って指定していました。このコードの結果は、オブジェクトのコレクションになります。各オブジェクトには、グループ化したものとなる Key プロパティがあります (この場合は の結果ですF.Date.DayOfYear / 7
。各オブジェクトは、グループ条件を満たした T からのオブジェクトのコレクションになります。
カルチャが気になる場合は、次のコードでそれを考慮します。
var ci = CultureInfo.CurrentCulture;
var cal = ci.Calendar;
var rule = ci.DateTimeFormat.CalendarWeekRule;
var firstDayOfWeek = ci.DateTimeFormat.FirstDayOfWeek;
var groups = from F in DB.T
group F by cal.GetWeekOfYear(F, rule, firstDayOfWeek) into R
select R;