Группировать по неделям года (по номеру недели) в Linq to SQL - PullRequest
5 голосов
/ 07 августа 2010

В обычном 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)

Ответы [ 6 ]

7 голосов
/ 07 августа 2010

LINQ to SQL не поддерживает метод Calendar.WeekOfYear , но вы можете потенциально создать функцию TSQL , которая переносит вызов DatePart .Уловка 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
1 голос
/ 06 декабря 2018

Вы можете использовать метод SqlFunctions.DatePart из пространства имен System.Data.Entity.SqlServer .

// Return the week number
From F In DB.T Group R By SqlFunctions.DatePart("week", F.Date)
1 голос
/ 07 августа 2010

Это работает правильно.

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

Вы указали группу неправильно.Результатом этого кода будет коллекция объектов.Каждый объект будет иметь свойство Key, по которому вы группируете (в данном случае результат F.Date.DayOfYear / 7. Каждый объект будет набором объектов из T, удовлетворяющих условию группы.

0 голосов
/ 11 июля 2017

Сначала вы должны получить дату первого дня недели.

Чтобы получить дату первого дня недели. Вы можете использовать этот код:

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = dt.DayOfWeek - startOfWeek;
        if (diff < 0)
        {
            diff += 7;
        }
        return dt.AddDays(-1 * diff).Date;
    }
}

Затем вы можете сгруппировать по первому дате недели.

Итак, этот код в обычном SQL:

SELECT * From T GROUP BY DATEPART(wk, T.Date)

можно сделать в Linq to SQL следующим образом

T.GroupBy(i => i.Date.StartOfWeek(DayOfWeek.Monday));
0 голосов
/ 07 августа 2010

Если вас беспокоит культура, в которой вы находитесь в следующем коде, примите это во внимание:

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;
...