LINQ .Startswith 或 .Contains VB.NET4 中的问题

Posted

技术标签:

【中文标题】LINQ .Startswith 或 .Contains VB.NET4 中的问题【英文标题】:LINQ .Startswith or .Contains problems in VB.NET4 【发布时间】:2011-03-24 14:23:38 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

EntryObject.FileName 可以是NULL,所以EntryObject.FileName.StartsWith(..) 可以抛出NullReferenceException

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

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

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

【讨论】:

我以为你需要AndAlso 才能短路。 @Gabe 谢谢,你当然是对的。我不是VB专家。答案已更新。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

如果您使用 linq to 实体,那么我认为它不支持startswith 或 contains。看到这个帖子*** post

【讨论】:

这与手头的问题无关。

以上是关于LINQ .Startswith 或 .Contains VB.NET4 中的问题的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities 和 String.StartsWith 的问题

Webform--LinQ 分页组合查询

Linq学习日记-模糊查询

通配符搜索LINQ to SQL

EF 在使用 StartsWith 过滤时不使用 SQL 索引

IndexOf() LastIndexOf() Contains() StartsWith() EndsWith()方法比较