我有一个分组依据,我想找出两个日期之间的差异,然后将结果添加到最终总和。但我不断收到无法从时间跨度转换为 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();
WorkTime
是 TimeSpan
类型,Enddate
和 scandate
是 DateTime
类型.
我怎样才能得到时间跨度的总和?
最佳答案
这是一项具有挑战性的任务,主要是因为 LINQ to Entities 不支持 DateTime
和 TimeSpan
的大部分 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/