【问题标题】:Entity Framwork, group by day/week/month working on a datetime实体框架,按日期/周/月分组
【发布时间】:2016-06-15 07:30:22
【问题描述】:

正如标题所说,我的表中有一个日期时间列。

在三种不同的情况下,我需要以三种方式按我的记录进行分组:

  1. 按天分组
  2. 按周分组
  3. 按月分组

如果可能的话,我如何在实体框架中使用 lambda 表达式执行这 3 种不同的分组语句?

更新:链接的问题是重复的,不是真正的重复。我要的是 lambda 解决方案,但链接中没有它

【问题讨论】:

标签: c# sql sql-server entity-framework datetime


【解决方案1】:

你可以使用这个方法:

var ByDayGrouped = new TestEntities().Objects.GroupBy(O => new { O.date.Year, O.date.Month, O.date.Day }).ToList();

var ByMonthGrouped = new TestEntities().Objects.GroupBy(O => new { O.date.Year, O.date.Month }).ToList();

var ByWeekGrouped = new TestEntities().Objects.GroupBy(O => (O.date.DayOfYear % 7) + M ).ToList();

【讨论】:

  • 是否需要“.Objects”?这是什么?
  • "Objects" 是我的 DbSet 的名称。它可以是任何基于您的项目的东西
  • M 查询中的M 变量是什么?
  • 它是一个数字,取决于你想成为一周中的第一天
【解决方案2】:

使用这个

List<MyEntitiy> list = (from e in Context.MyEntities group e by e.Date.Day into g select g).ToList();

对于月份,将 e.Date.Day 替换为 e.Date.Month

对于Week,您必须首先Calculate WeekOfYear

public int GetWeekOfYear(this DateTime d)
{
    GregorianCalendar c = new  GregorianCalendar();
    return c.GetWeekOfYear(d,CalenderWeekRule.FirstDay,DayOfWeek.Sunday);
}

并使用

List<MyEntitiy> list = (from e in Context.MyEntities group e by e.Date.GetWeekOfYear() into g select g).ToList();

【讨论】:

    【解决方案3】:

    您可以使用以下格式使用 linq 和 lambda 表达式

    按天分组

        var results = from p in db.table
                              group p.data by p.DateTime.UtcNow.Day into g
                              select new { Id = g.Key, parameters = g };
    

    按周分组

        var result = from p in db.table
                             group p.data by p.DateTime.UtcNow.DayOfWeek into g
                              select new { Id = g.Key, parameters = g}
    

    否则

        //get the 7days of the week by the below method and perform between operation
        DateTime fromDate = DateTime.Today.Subtract(new TimeSpan(7, 0, 0, 0));
        DateTime today = DateTime.Today;
        var result = from p in db.table
                             group p.data by (DbFunctions.TruncateTime(today) && DbFunctions.TruncateTime(today) >= DbFunctions.TruncateTime(fromDate)) into g
                             select new { Id = g.Key, parameters = g}
    

    月份类似

        DateTime fromDate = DateTime.Today.Subtract(new TimeSpan(30, 0, 0, 0));
        DateTime today = DateTime.Today;
        var result = from p in db.table
                             group p.data by (DbFunctions.TruncateTime(today) && DbFunctions.TruncateTime(today) >= DbFunctions.TruncateTime(fromDate)) into g
                             select new { Id = g.Key, parameters = g}
    

    【讨论】:

    • 为什么“参数 = g.ToList()”?它的用途是什么?它在“参数”中插入“表”的所有字段?