2012-09-27 189 views
0

好吧,我想要做的是從它們各自的數據庫中獲取兩個數據集,並使用由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() 

回答

0

好吧,看起來比較失敗,因爲默認情況下使用了引用比較。所以,我通過實施IEqualityComparer解決了這個問題。

相關問題