这可能是一个新手问题...
在我的代码中,我可以轻松地使用“where Obj.Feld = String”,但使用“where Obj.Feld.StartsWith(”a“)”不起作用。请参阅以下两个功能:
Public Function EntriesByFileName(ByRef Database() As Entry, ByVal Filename As _
String) As IEnumerable(Of Entry)
Dim Result As IEnumerable(Of Entry) = From EntryObject In Database _
Where (EntryObject.FileName = Filename) Select EntryObject
Return Result
End Function
Public Function EntriesLikeFileName(ByRef Database() As Entry, ByVal _
Filename As String) As IEnumerable(Of Entry)
Filename = Filename.ToLower
Dim Result As IEnumerable(Of Entry) = From EntryObject In Database _
Where EntryObject.FileName.StartsWith("a") Select EntryObject
Return Result
End Function
第一个函数(byFileName)工作正常。第二个函数(LikeFileName)没有。使用Startswith我得到“对象引用未设置为对象的实例”。我做错了什么?
数据库是一个对象数组,一个由字符串组成的结构
答案 0 :(得分:4)
EntryObject.FileName
可以是NULL
,因此EntryObject.FileName.StartsWith(..)
可以抛出NullReferenceException
。
将条件更改为首先检查NULL
例如
if EntryObject.FileName <> nothing AndAlso EntryObject.FileName.StartsWith(..)
在这里使用AndAlso
使用短路,这意味着如果不满足第一个条件,则不会评估第二个条件,因此我们无法获得NullReferenceException
。
答案 1 :(得分:2)
确保数据库不包含任何空条目。您可以在null上应用=运算符,但不能在其上调用任何方法,因此StartsWith()失败。
答案 2 :(得分:1)
看起来像EntryObject
对象中的一个FileName
属性设置为null。在第一种方法中,它不会被检测到,因为您可以将空值与其他值进行比较,但在第二种方法中,您尝试在空对象上调用一个方法,该方法将引发异常。
答案 3 :(得分:0)
如果您使用linq实体,那么我认为它不支持startswith或contains。请参阅此帖子Stackoverflow post