使用 List.FindAll 的对象引用错误

Object Reference Error Using List.FindAll

我有一个奇怪的问题正在努力解决:

我有一个表单可以使用 LINQ 查询执行多种不同的搜索。在 99% 的时间里,代码将执行得很好,没有任何错误,但是,在完全随机的情况下,我的表单落在以下行上:

     'Find all tickets belonging to a user
     Dim _userTicketsList As List(Of Ticket) = Tickets.FindAll(Function(p) 
                 p.ticket_firstname.ToUpper = NewSearchString And 
                 CDate(p.ticket_created_at.Value.ToShortDateString) >= date1 
                 And CDate(p.ticket_created_at.Value.ToShortDateString) <= date2)

我得到的错误是Object Reference Not Set To An Instance Of An Object

从那时起,任何搜索都将继续对这行代码进行轰炸,直到我重新启动我的应用程序。我再次执行搜索,一切正常。

我不明白是什么导致了这个错误的发生。如果 .FindAll returns 0 个结果或者 returns 任意数量的结果,就会发生这种情况。

我是否可以确定要设置的对象是什么?我假设它 _userTicketsList 但它为什么有时有效有时无效是没有意义的。

我知道在没有看到每一段代码的情况下可能很难发表评论,但是无论如何我可以尝试以不同的方式调试它吗?调试器位于 23,000 多个 Ticket 项目的这行代码上,所以我什至无法确定是否存在导致问题的特定 Ticket

非常感谢任何帮助或指导。 谢谢

好吧,您基本上可以用 try catch 语句修饰您的 lambda 表达式,只是记录/处理错误。

'Find all tickets belonging to a user
Dim _userTicketsList As List(Of Ticket) = Tickets.
    FindAll(Function(p)

                Dim condition1 As Boolean
                Dim condition2 As Boolean
                Dim condition3 As Boolean

                Try
                    condition1 = p.ticket_firstname.ToUpper = NewSearchString
                Catch ex As Exception
                    'Do Something
                End Try

                Try
                    condition2 = CDate(p.ticket_created_at) >= date1
                Catch ex As Exception
                    'Do Something
                End Try

                Try
                    condition3 = CDate(p.ticket_created_at) <= date2
                Catch ex As Exception
                    'Do Something
                End Try

                Return condition1 And condition2 And condition3

            End Function)

根据 OP 的评论编辑代码添加

If _userTicketsList.Any = False Then
    _userTicketsList = Nothing
End If

我还想确保您了解 vb.net 中使用 And 与 AndAlso 子句的区别。

当写类似 If(A and B) 的东西时 A 和 B 都会执行。

使用AndAlso时,如果A为假,则不会执行B, 既然你用的是And,我想我会提一下。