当前位置 : 主页 > 编程语言 > c语言 >

VB.Net Linq到实体空比较 – ‘什么都不是’或’=什么都没有’?

来源:互联网 收集:自由互联 发布时间:2021-06-24
我们在VB.Net中有几个项目,使用.Net Framework 4和 Linq to Entities来处理我们的许多SQL查询.迁移到EF对我们来说是一个新的转变(已经使用了大约4-6个月),并得到了高层管理人员的支持,因为我们
我们在VB.Net中有几个项目,使用.Net Framework 4和 Linq to Entities来处理我们的许多SQL查询.迁移到EF对我们来说是一个新的转变(已经使用了大约4-6个月),并得到了高层管理人员的支持,因为我们可以更快地编写代码.我们仍然使用很多存储过程,但我们甚至也通过Linq到实体执行这些过程.

我希望清除一些混乱,我找不到一个有意义的直接答案.我们有一些查询,我们想要特定字段具有NULL值的记录.这些是简单的选择查询,没有聚合或左连接等.Microsoft建议查询看起来像这样MSDN Link:

dim query = from a in MyContext.MyTables
Where a.MyField = Nothing
Select a

我有几个项目,我正是这样做的,它工作得很好,在IDE中没有警告.最近,另一个开发人员创建了一个新项目,当他像上面那样进行空检查时,我们都在IDE中收到此警告:

警告1此表达式将始终计算为Nothing(由于equals运算符的空传播).要检查值是否为null,请考虑使用“Is Nothing”.

比较项目,每个都有选项显式和选项严格.如果我们忽略警告,我们会在应用程序运行时获得我们正在寻找的确切记录集.如果我将=符号更改为IS,则警告消失.但为什么这个警告出现在一个项目而不是其他项目?即使在MSDN上也有使用equals运算符的例子,这令人困惑.

我相信你在这里看到的是MyField是Nullable(Of T)类型.可能是一个原始的整数,单一等…

您看到此警告的原因是因为编译器将基本类型的常规相等运算符提升为Nullable(Of T)版本.它基本上执行以下操作

Dim myField As Integer? = a.MyField
Dim other As Integer? = Nothing
If myField = other Then
 ...
End If

问题虽然是整数?没有什么值,它不会与任何东西相比.因此,上面的Where子句将始终返回False.编译器试图警告你有关Nullable(Of T)的这个有问题的角落,并推动你进行Is Nothing检查,这将确定a.MyField是否具有非null值.

这篇博客文章非常详细地解释了为什么要生成此警告以及它背后的所有机制.本文是为C#编写的,但基本前提也适用于VB.Net.

> http://blogs.msdn.com/b/abhinaba/archive/2005/12/14/503533.aspx

网友评论