我有一个包含两列的数据库表:StartDateTime
和FinishDateTime
。两者都是可以为空的日期时间列。
我想计算每行两个字段之间的Average
时间。即我记录的事件的平均持续时间。
我得到一个" DbArithmeticExpression参数必须有一个数字公共类型。"
示例EF代码,简化了演示。
from p in new DbContext()
where p.user_id = 123
&& p.StartDateTime != null
&& p.FinishDateTime != null
select new {p.StartDateTime, p.FinishDateTime})
.Average(p=> (p.FinishDateTime.Value - p.StartDateTime.Value).Ticks)
我喜欢上面的例子,因为SQL使这变得轻而易举。
答案 0 :(得分:2)
它取决于您的数据提供商,它可能支持DbFunctions
,您可以执行以下操作:
(from p in new DbContext()
where p.user_id = 123
&& p.StartDateTime != null
&& p.FinishDateTime != null
select new {p.StartDateTime, p.FinishDateTime})
.Average(x=> DbFunctions.DiffMilliseconds(p.FinishDateTime,p.StartDateTime))
如果没有,我认为你必须在选择之后将linq转到对象:
(from p in new DbContext()
where p.user_id = 123
&& p.StartDateTime != null
&& p.FinishDateTime != null
select new {p.StartDateTime, p.FinishDateTime})
.ToArray()
.Average(x=> (p.FinishDateTime -p.StartDateTime).Ticks)