6

通常の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)
4

6 に答える 6

8

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
于 2010-08-06T22:16:03.490 に答える
1

これは正しく動作します。

from F in DB.T group F by F.Date.DayOfYear / 7;

グループを間違って指定していました。このコードの結果は、オブジェクトのコレクションになります。各オブジェクトには、グループ化したものとなる Key プロパティがあります (この場合は の結果ですF.Date.DayOfYear / 7。各オブジェクトは、グループ条件を満たした T からのオブジェクトのコレクションになります。

于 2010-08-06T21:30:58.307 に答える
1

範囲変数名は、引数のない単純な名前または修飾名からのみ推測できます

于 2010-08-06T21:33:32.750 に答える
0

カルチャが気になる場合は、次のコードでそれを考慮します。

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;
于 2010-08-06T21:35:46.630 に答える