LINQ DB算术必须具有通用类型(日期比较

时间:2014-07-08 16:38:46

标签: c# sql asp.net-mvc linq

我正在尝试使用开始日期和结束日期从具有最高天数的数据库中获取记录。我一直在Entity.dll中得到一个System.Argument.Exception。

错误说明:

{"DbArithmeticExpression arguments must have a numeric common type."}

这是我的LINQ声明:

var maxDaysTask = whseTasks.Where(x => x.CompDate != null && x.TaskDate != null).Max(x => ((DateTime)x.TaskDate - (DateTime)x.CompDate).TotalDays);

CompDate(结束日期)和TaskDate(开始日期)都是可以为空的日期时间。有什么建议吗?

2 个答案:

答案 0 :(得分:14)

您不能在查询中使用减法:operator -在.NET中重载,但在SQL Server中不重载。

您可以使用SqlFunctions.DateDiff来达到您想要的效果:

var maxDaysTask = whseTasks
    .Where(x => x.CompDate != null && x.TaskDate != null)
    .Max(x => SqlFunctions.DateDiff("day", x.TaskDate, x.CompDate));

答案 1 :(得分:0)

我建议使用Nullable<T>的内置函数(例如HasValue属性)在这种情况下检查null。由于这些是可以为空的结构,因此通常无法访问内部值,这就是您出错的原因。确保使用Value属性来获取实际的DateTime结构

var maxDaysTask = whseTasks.Where(x => x.CompDate.HasValue && x.TaskDate.HasValue)
                            .Max(x => (x.TaskDate.Value - x.CompDate.Value).TotalDays);