【发布时间】:2017-08-11 14:57:41
【问题描述】:
我有一个分组依据,我想找出两个日期之间的差异,然后将结果添加到最终总和中。但我不断收到无法从时间跨度转换为长的错误。 这是我使用的代码:
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 类型。
我怎样才能得到时间跨度的总和?
【问题讨论】:
-
这个带有 null-coalesce 运算符 (
??) 的表达式甚至可以编译吗?new将始终返回一个实例,那么您在这里期望什么?请注意,TotalMilliseconds是double,TimeSpan.Zero是TimeSpan。 -
我在 (x.EndDate-x.Scandate) 中得到错误
-
对此的最快修复(只是为了让它不会失败,将 TimeSpan.Zero 更改为 TimeSpan.Zero.TotalMilliseconds。然后 null 合并的两个部分将返回相同的类型,并且那么它将自动装箱为 Long。此外,您不需要新的 TimeSpan,因为减去两个日期值会返回一个 TimeSpan。所以您可以这样做: (x.EndDate-x.ScanDate).TotalMilliseconds??TimeSpan .Zero.Milliseconds,甚至更简单的(x.EndDate-x.ScanDate).TotalMilliseconds??0
-
您使用的是哪个 EF 版本(EF6 或 EF Core)?
-
它的 EF6 ,没有更多错误,但是当我尝试获取数据时崩溃了表达。
标签: c# entity-framework linq