如果只有一个可以为空,则Linq DateTime表达式不会比较

时间:2010-06-15 19:32:07

标签: c# linq

我遇到了以下异常:

  

二元运算符GreaterThanOrEqual   没有为类型定义   'System.Nullable`1 [System.DateTime的]'   和'System.DateTime'。

我从类属性获取左手表达式,该属性是可以为空的datetime变量,而我的右侧是使用

Expression.Constant(new Nullable<DateTime>(DateTime.Now))

然而,尽管明确地将右手表达式设置为可空类型

,我仍然会得到上述异常

2 个答案:

答案 0 :(得分:14)

Expression.Constant接受一个对象,因此在您的代码中,参数被加框。拳击可以为空的值实际上是基础值(请参阅Boxing Nullable Types),因此Expression.Constant认为参数是DateTime而不是DateTime?。

您可以强制ConstantExpression为DateTime吗?通过使用带有Type:

的Expression.Constant的重载
Expression.Constant(DateTime.Now, typeof(DateTime?))

答案 1 :(得分:2)

可归结为可空类型是一个相当漏洞的抽象。它们在将DateTime分配给DateTime时工作正常吗?但是通过比较,事情变得棘手,因为System.Nullable并不真正知道如何处理它们。

DateTime之间没有隐式转换?和DateTime,所以你需要做的是实际从可空的Null中获取一个真实的DateTime值来进行比较。最简单的方法是使用可空的DateTime中的GetValueOrDefault()方法。如果它不为null,这将为您提供值,如果为null,则为默认的DateTime(我相信为DateTime.MinValue)。