【问题标题】:how to use entity framework to group by date not date with time如何使用实体框架按日期而不是按时间分组
【发布时间】:2014-01-07 03:19:33
【问题描述】:

我的代码:

//get data
var myData = from log in db.OperationLogs
              group log by log.CreateTime.Date  into g
              orderby g.Key
              select new { CreateTime = g.Key, Count = g.Count() };

此代码将抛出一个异常,如实体框架不支持获取日期操作。 因为log.createtime都有日期和时间,我想按日期分组,我该怎么做

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    使用EntityFunctions.TruncateTime Method (Nullable<DateTime>)。它将在生成的 SQL 查询中转换为TRUNCATETIME() TSQL 函数,这可以满足您的需要:

    返回表达式,时间值被截断。

    所以你的代码应该如下:

    //get data
    var myData = from log in db.OperationLogs
                 group log by EntityFunctions.TruncateTime(log.CreateTime) into g
                 orderby g.Key
                 select new { CreateTime = g.Key, Count = g.Count() };
    

    【讨论】:

    • 如果您使用 EF6,EntityFunctions 已过时,请用 DbFunctions 替换它(谢谢,答案对我有帮助:))
    • TruncateTime 仍然返回时区,因此如果 db 类型为 datetimeoffset,我们将无法获得所需的结果。如果类型是日期时间,它将起作用。
    • 更准确地说是 System.Data.Entity.DbFunctions.TruncateTime
    • 使用 EFCore,您只需使用 CreateTime.Date,而不必再使用任何截断函数。
    • EntityFunctions 已弃用,应为 DbFunctions
    【解决方案2】:

    对于以后的 Entity Framework 版本,这是一种更简单的方法。

    var query = Data
    .GroupBy(o => new { EventDate = o.EventDate.Date })
    .Select(s => new SalesData()
    {
        EventDate = s.Key.EventDate,
        Amount = s.Sum(o => o.Amount),
        Qty = s.Sum(o => o.Qty),
        RefundAmount = s.Sum(o => o.RefundAmount),
        RefundQty = s.Sum(o => o.RefundQty),
    })
    .OrderBy(o => o.EventDate)
    .ToList();
    

    返回查询;

    【讨论】:

      【解决方案3】:
           var result = from s in entitiesModel.TvysFuelTankDatas
                                 orderby s.Datetime ascending
                                 group s by new { y = s.Datetime.Year, m = s.Datetime.Month + "/", d = s.Datetime.Day + "/" } into g
                                 select new WellDrillData { Date = Convert.ToDateTime(g.Key.d.ToString() + g.Key.m.ToString() + g.Key.y.ToString()), Depth = (double)g.Sum(x => x.Difference) };
      
                    List<WellDrillData> dailyFuelConsumptions = result.ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多