【发布时间】:2012-02-03 12:44:53
【问题描述】:
我们今天在这行代码中遇到了Nullable object must have a value 错误:
list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= barDate
有趣的是,我确信这曾经可以正常工作(并且基础数据中总是存在少量空值)。从逻辑上讲,它对我来说看起来不错。检查HasValue 和AndAlso 看起来 好像它们会保护我们免受任何 Null 危险。
但似乎突然间他们不是了。我错过了什么吗?
好的,我们可以把它改成这样,这样就消除了错误:
list = From x In Me Where If(x.FooDate.HasValue, x.FooDate.Value.Date >= barDate,False)
但这在我看来不太可读。有什么想法吗?
更新...和忏悔:
在简化上面的代码以缩短代码行时,我遗漏了代码的关键部分。原来的问题应该是这样的:
list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= fromDate And x.FooDate.Value.Date <= toDate
由于短路和运算符优先级的规则(如outlined in an answer 到我自己的很久以前的问题),我需要在指令的第二部分周围添加括号,以停止 LINQ 评估第二个 x.FooDate.Value.Date:
list = From x In Me Where x.FooDate.HasValue AndAlso (x.FooDate.Value.Date >= fromDate and x.FooDate.Value.Date <= toDate)
感谢这两个答案提供快速测试代码以验证 LINQ 确实遵守 AndAlso 并迫使我更仔细地研究原始问题。
【问题讨论】:
-
你能用示例数据重现它并向我们展示这段代码吗?
-
这是 LINQ to Objects,还是您在使用其他 LINQ 提供程序?另外,你能包括整个 LINQ 查询吗?您似乎至少缺少选择部分
-
这是 LINQ to SQL,还是我返回了一些奇怪的东西(例如,不是 IEnumerable)?
-
@TimSchmelter 刚刚回来,我看到你提供了一个简化的示例,所以我会试试你的......谢谢
-
我猜这是 LINQ to Objects(我用过的唯一一种),其中 Me 是一个 BindingList(Of Foo)
标签: vb.net linq null short-circuiting