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

C# LINQ DB算法必须具有通用类型(日期比较,c#,sql,asp.net-mvc,linq,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 !=

我正在尝试使用开始日期和结束日期从天数最多的数据库中获取记录。我一直在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(开始日期)都是可为空的日期时间。有什么建议吗?

您不能在查询中使用减法:
运算符-
在.NET中重载,但在SQL Server中没有重载

您可以使用以实现所需的效果:

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

我建议在这种情况下使用
Nullable
的内置函数,例如
HasValue
属性来检查null。因为这些是可为null的结构,所以通常无法访问内部值,这就是出错的原因。请确保使用
Value
属性来获取实际的日期时间结构t

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

我得到{“days”不是'SqlServer.DATEDIFF'函数中的DATEPART参数的有效值。}@user3788671哦,它应该是
“day”
,而不是
“days”
@dasblinkenlight非常感谢!