c# - Linq 日期时间差和

标签 c# entity-framework linq

我有一个分组依据,我想找出两个日期之间的差异,然后将结果添加到最终总和。但我不断收到无法从时间跨度转换为 Long 的错误。 这是我使用的代码:

var summary = (
  from p in db.CP_SDV_Acc
  where p.Scandate >= start && p.EndDate <= end && p.Device==divice
  let k = new
  {
    //try this if you need a date field 
    //   p.SaleDate.Date.AddDays(-1 *p.SaleDate.Day - 1)
    Device = p.Device,
  }
  group p by k into t
  select new OeeRecovery
  {
    Device = t.Key.Device,

    GoodPcs = t.Sum(p => p.GoodPcs),
    BadPcs=t.Sum(p=>p.BadPcs),
    Oee =(decimal)(t.Sum(p => p.GoodPcs)- t.Sum(p => p.BadPcs)) / t.Sum(p => p.GoodPcs),
    WorkTime = t.Sum(x=>new TimeSpan(x.EndDate-x.Scandate).TotalMilliseconds??TimeSpan.Zero)

    //t.Sum(new TimeSpan( p =>  p.EndDate - p.Scandate))
    //t.Aggregate(TimeSpan.Zero, (total, it) =>total += (it.EndDate-it.Scandate)),
}).ToList();

WorkTimeTimeSpan 类型,EnddatescandateDateTime 类型.
我怎样才能得到时间跨度的总和?

最佳答案

这是一项具有挑战性的任务,主要是因为 LINQ to Entities 不支持 DateTimeTimeSpan 的大部分 CLR 方法/属性/运算符。

我看到的唯一解决方案是使用 DbFunctions.DiffSeconds规范函数获取秒数差异,将它们相加,然后使用另一个规范函数 DbFunctions.CreateTime 转换为 TimeSpan ,根据总秒数手动计算小时、分钟和秒数:

...
group p by k into t
let workSecs = t.Sum(x => DbFunctions.DiffSeconds(x.Scandate, x.EndDate)) ?? 0
select new OeeRecovery
{
    ...
    WorkTime = DbFunctions.CreateTime(workSecs / 3600, (workSecs / 60) % 60, workSecs % 60)
    ...
}

关于c# - Linq 日期时间差和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45638220/

相关文章:

c# - 编写此 linq 查询的更好方法?

c# - 梳理POCO、Repository Pattern、Unit of Work、ORM

c# - DbContext 在传递到另一个 `using` block 时过早处置

c# - Lambda 检查列表是否包含所有属性的某些属性值

c# - 使用 LINQ 在 XML 中的特定位置插入特定的 XElement

c# - 使用 webbrowser 来自 iframe 的完整 HTML 代码

c# - 是否可以在不将源移动到目标的情况下在 C# 中进行拖放?

c# - UWP AutoSuggestBox QueryIcon 在添加样式后消失

c# - EF4.1(代码优先)——如何指定复合关系

C# 林奇 : Dynamically create property and values that includes sum of a value from a grouped query