如何调试Linq - 连接方法永远不会到达ResultSelector

问题描述:

好吧,我想要做的是从它们各自的数据库中获取两个数据集,并使用由Join扩展方法形成的Linq查询来连接它们。 Linq查询之前做过工作,但经过一些重构(在代码的其他部分)之后,它不再存在。我真的看不出有什么不同。如何调试Linq - 连接方法永远不会到达ResultSelector

我已经扩展了KeySelectors和ResultSelector以便能够在其中放置断点。这两个枚举(localSeq和remoteSeq)工作正常,他们得到了正确数量的元素等。两个序列的元素被格式化为Object()。 KeySelectors(由函数CompositeJoinKeySelector实现)似乎也可以工作。这个函数应该做的是从每个元素中选择正确的字段,以便.Join方法知道如何检查相等性。这似乎是失败的这一步(检查是否相等)。

当我遍历代码时,linq查询遍历两个数据集并执行KeySelector。这似乎返回了预期的值。然而,之后,它不会在ResultSelector中中断。在我看来,这意味着它永远无法处理结果,因为他没有找到匹配的“行”。这很奇怪,因为我逐步执行并且两个KeySelectors都返回一个二维Object数组,并且匹配的条目当然存在。

有没有什么办法可以看到这个(大概)嵌套循环过程,并查看平等比较失败的地方?

  Dim LocalSeq As IEnumerable(Of Object()) = From locRow As Object() In LocalArray 
     Dim RemoteSeq As IEnumerable(Of Object()) = From remRow As Object() In RemoteArray 

     Dim joinSeq As IEnumerable(Of Object()) = LocalSeq.Join(Of Object(), Object, Object())(RemoteSeq, _ 
                           Function(locRow As Object()) 
                            Dim locRes As Object() = CompositeJoinKeySelector(locRow, LocalKeyList) 
                            Return locRes 
                           End Function, _ 
                           Function(remRow As Object()) 
                            Dim remRes As Object() = CompositeJoinKeySelector(remRow, RemoteKeyList) 
                            Return remRes 
                           End Function, _ 
                           Function(locRow As Object(), remRow As Object()) 
                            Dim joinRes As Object() = JoinRowArrays(locRow, remRow, FinalJoinSelectColumnList) 
                            Return joinRes 
                           End Function) 

     Return joinSeq.ToArray() 

好吧,看起来比较失败,因为默认情况下使用了引用比较。所以,我通过实施IEqualityComparer解决了这个问题。