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

时间:2015-01-29 07:10:22

标签: vb.net linq

我有一个难以解决的古怪问题:

我有一个使用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返回0结果或者返回任意数量的结果,则会发生这种情况。

无论如何,我可以确定Object正在尝试设置什么?我假设它是_userTicketsList但是它有意义为什么有时候它有效并且有时候它没有。

我知道在没有看到每一段代码的情况下可能很难评论,但无论如何我可以尝试以不同方式调试吗?调试器位于这行代码上,包含23,000多个Ticket项,因此,如果导致问题的特定Ticket,我甚至无法解决问题。

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

1 个答案:

答案 0 :(得分:0)

好吧,你基本上可以用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 vs. AndAlso子句的区别。

写If(A和B)之类的东西 A和B都将执行。

使用AndAlso时,如果A为假,则不执行B, 因为你正在使用And,我想我会提到它。