好的,我要做的是从它们各自的数据库中获取两个数据集,并使用由 Join 扩展方法形成的 Linq 查询将它们连接起来。Linq 查询之前确实有效,但经过一些重构(在代码的其他部分)后它不再有效。我真的看不出有什么区别。
我已经扩展了 KeySelector 和 ResultSelector 以便能够在其中放置断点。这两个可枚举(localSeq 和 remoteSeq)工作正常,它们得到了正确数量的元素等。两个序列的元素都被格式化为 Object()。KeySelectors(由 CompositeJoinKeySelector 函数实现)似乎也可以工作。这个函数应该做的是从每个元素中选择正确的字段,以便 .Join 方法知道如何检查是否相等。似乎是这一步(检查是否相等)失败了。
当我单步执行代码时,linq 查询会遍历两个数据集并执行 KeySelector。这似乎返回了预期的值。但是,之后它不会在 ResultSelector 中中断。在我看来,这意味着它永远不会处理结果,因为他没有找到匹配的“行”。这很奇怪,因为我逐步执行,两个 KeySelector 返回一个二维 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()