在实体框架中计算datetime对象的时间差给出错误

本文关键字:时间差 出错 错误 对象 datetime 实体 框架 计算 | 更新日期: 2023-09-27 17:54:28

我正在尝试计算两个日期之间的时差,并希望获得我的日期的日期名称。

举例:4/7/2016

    周一
  • :

这是我的班级:

public class Attendance
{
      public int Id { get; set; }
      public Nullable<System.DateTime> StartDateTime { get; set; }
      public Nullable<System.DateTime> EndDateTime { get; set; }
}

当我尝试这样做时:

 var query = (from t in context.Attendance
              select new 
              {
                 timeDiff=t.EndDateTime.Value.Subtract(t.StartDateTime.Value).TotalHours,
                 Day=System.StartDateTime.ToString("dddd");
              }).tolist();
误差

LINQ to Entities不能识别方法System。时间间隔减去(System.DateTime)'方法,此方法不能翻译成存储表达式

我不想这样做:

 var query = (from t in context.Attendance.toList().
                  select new 
                  {
                     timeDiff=t.EndDateTime.Value.Subtract(t.StartDateTime.Value).TotalHours,
                     Day=System.StartDateTime.ToString("dddd");
                  }).tolist();

我有Datetime的格式像这样存储在我的表中,所以我想要的输出如下所示的差异字段:

startDatetime              Enddatetime                Difference
----------------------------------------------------------------
2016-06-29 15:52:32.360    2016-06-29 15:52:36.970    00:00:04
2016-06-29 15:53:32.360    2016-06-29 15:55:36.970    00:2:00
2016-06-29 15:53:32.360    2016-06-29 16:55:36.970    01:02:00

在实体框架中计算datetime对象的时间差给出错误

您不能在EF查询中使用。net框架特定的方法,除非为它们定义了规范函数。但是,对于您的特定查询,有:

试题:

 var query = (from t in context.Attendance
                  select new 
                  {                        
                     TimeDiff=SqlFunctions.DateDiff("hour",t.StartDateTime, t.EndDateTime),
                     Day=SqlFunctions.DateName("weekday", t.StartDateTime);
                  }).ToList();

更新

在你的问题中反映所需输出的变化:

 var query = (from t in context.Attendance
                  select new 
                  {                        
                     StartDate = t.StartDateTime,
                     EndDate = t.EndDateTime,       
                     TimeDiff=SqlFunctions.DateDiff("second",t.StartDateTime, t.EndDateTime),
                  }).ToList();

然后你可以这样写:

foreach(var q in query)
{
  Console.Write($"{q.StartDate:d} {q.EndDate:d} {TimeSpan.FromSeconds(q.TimeDiff):c}");
}