3

这可能是一个新手问题...

在我的代码中,我可以轻松地使用“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 我得到“对象引用未设置为对象的实例”。我究竟做错了什么?

数据库是一个对象数组,一个由字符串组成的结构

4

4 回答 4

4

EntryObject.FileName可以NULL,所以EntryObject.FileName.StartsWith(..)可以扔一个NullReferenceException

将条件更改为首先检查NULL例如

if EntryObject.FileName <> nothing AndAlso EntryObject.FileName.StartsWith(..) 

在这里使用AndAlso短路,这意味着如果不满足第一个条件,则不会评估第二个条件,因此我们无法获得NullReferenceException.

于 2010-08-03T07:59:07.357 回答
2

确保数据库不包含任何空条目。您可以在 null 上应用 = 运算符,但不能在其上调用任何方法,因此 StartsWith() 失败。

于 2010-08-03T07:53:39.910 回答
1

看起来其中一个EntryObject对象的FileName属性设置为 null。在第一种方法中它不会被检测到,因为您可以将空值与其他值进行比较,但在第二种方法中,您试图在空对象上调用一个方法,该方法将引发异常。

于 2010-08-03T08:19:03.043 回答
0

如果您使用 linq 到实体,那么我认为它不支持 startwith 或 contains。请参阅此帖子 Stackoverflow 帖子

于 2010-08-03T08:02:59.767 回答