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

时间:2012-09-27 14:51:17

标签: vb.net linq

好的,我要做的是从各自的数据库中获取两个数据集,并使用由Join扩展方法形成的Linq查询将它们连接起来。 Linq查询之前确实有效,但经过一些重构(在代码的其他部分)之后它就不再存在了。我真的没有看到差异。

我已经扩展了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()

1 个答案:

答案 0 :(得分:0)

好的,似乎比较失败了,因为默认使用了引用比较。所以,我通过实现IEqualityComparer解决了这个问题。