代码之家  ›  专栏  ›  技术社区  ›  ariel

在Linq to SQL中按周分组(周数)

  •  5
  • ariel  · 技术社区  · 15 年前

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

    如何在linqtosql中做到这一点?

    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 回复  |  直到 15 年前
        2
  •  8
  •   Greg Bray    15 年前

    LINQ to SQL 不支持 Calendar.WeekOfYear 方法,但您可能会创建一个TSQL function that wraps the call to DatePart

    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
    
        3
  •  2
  •   Fred Fickleberry III    7 年前

    你可以用 SqlFunctions.DatePart 方法从 System.Data.Entity.SqlServer 命名空间。

    // Return the week number
    From F In DB.T Group R By SqlFunctions.DatePart("week", F.Date)
    
        4
  •  1
  •   sgriffinusa    15 年前

    这是正确的。

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

    F.Date.DayOfYear / 7 . 每个对象都是T中满足组条件的对象的集合。

        5
  •  0
  •   Richard Slater    15 年前

    如果您关心您在以下代码中所处的文化,则会考虑到这一点:

    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;
    
        6
  •  0
  •   hoss77    8 年前

    首先你应该知道一周中第一天的日期。

    得到一周中第一天的日期。 您可以使用以下代码:

    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)
    

    T.GroupBy(i => i.Date.StartOfWeek(DayOfWeek.Monday));