LINQ是否在VB.NET中进行短路评估?
我们有一个LINQ是否在VB.NET中进行短路评估?,vb.net,linq,null,short-circuiting,Vb.net,Linq,Null,Short Circuiting,我们有一个可为null的对象今天在这行代码上必须有一个值错误: list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= barDate 有趣的是,我确信这种方法可以很好地工作(并且在底层数据中总是有少量的空值)。从逻辑上讲,我觉得不错。检查HasValue和AndAlso似乎可以保护我们免受任何零危险 但似乎突然之间他们不是。我错过什么了吗 好的,我们可以纠正它,这样就消除了错误: list
可为null的对象今天在这行代码上必须有一个值错误:
list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= barDate
有趣的是,我确信这种方法可以很好地工作(并且在底层数据中总是有少量的空值)。从逻辑上讲,我觉得不错。检查HasValue
和AndAlso
似乎可以保护我们免受任何零危险
但似乎突然之间他们不是。我错过什么了吗
好的,我们可以纠正它,这样就消除了错误:
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
多亏了这两个答案,他们抛出了快速测试代码来验证LINQ是否真的遵守了AndAlso,并迫使我更仔细地研究原始问题。我非常确定您的查询是安全的,至少以下示例代码是:
Dim dateList As New List(Of Nullable(Of Date))
For i As Int32 = 0 To 12
If (i Mod 3 = 0) Then
dateList.Add(Nothing)
Else
dateList.Add(New Date(2012, i, 1))
End If
Next
Dim july = New Date(2012, 7, 1)
Dim fromJuly = (From m In dateList
Where m.HasValue AndAlso m.Value.Date >= july).ToList
注意:如果我将和替换为和,我将得到您的异常
所以问题一定在别的地方。请给我们看更多你的课。应该有用。我写了这段代码,它对我来说很好,即使barDate
设置为Nothing
Sub Main()
Dim barDate As Nullable(Of DateTime) = Nothing
Dim List = From x In GetDates() Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date > barDate
Console.WriteLine(List.Count())
End Sub
Function GetDates() As List(Of Foo)
Dim l = New List(Of Foo)
l.Add(New Foo With {.FooDate = DateTime.Now})
l.Add(New Foo)
Return l
End Function
Class Foo
Private m_fooDate As DateTime?
Public Property FooDate() As DateTime?
Get
Return m_fooDate
End Get
Set(ByVal value As DateTime?)
m_fooDate = value
End Set
End Property
End Class
您能用示例数据重现它并向我们展示这段代码吗?这是LINQ到对象,还是您在使用其他LINQ提供程序?另外,您可以包括整个LINQ查询吗?您似乎至少缺少了Select部分这是LINQ到SQL,还是我返回了一些奇怪的东西(例如,这不是IEnumerable)?@TimSchmelter刚刚回到这里,我看到您提供了一个简化的示例,所以我将尝试您的。。。感谢这是我猜的LINQ to对象(我使用过的唯一一种),其中我是一个绑定列表(Foo)。我运行了你的代码,得到了与你相同的结果,所以你是对的,问题一定在别处。我会继续digging@hawbsl:与其在第二个条件中添加括号,不如简单地使用和而不是和?还是我误解了“操作员优先级”问题?
Sub Main()
Dim barDate As Nullable(Of DateTime) = Nothing
Dim List = From x In GetDates() Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date > barDate
Console.WriteLine(List.Count())
End Sub
Function GetDates() As List(Of Foo)
Dim l = New List(Of Foo)
l.Add(New Foo With {.FooDate = DateTime.Now})
l.Add(New Foo)
Return l
End Function
Class Foo
Private m_fooDate As DateTime?
Public Property FooDate() As DateTime?
Get
Return m_fooDate
End Get
Set(ByVal value As DateTime?)
m_fooDate = value
End Set
End Property
End Class