0

OK、私がやろうとしているのは、それぞれのデータベースから 2 つのデータセットをフェッチし、Join 拡張メソッドによって形成された Linq クエリを使用してそれらを結合することです。Linq クエリは以前は機能していましたが、(コードの他の部分で) リファクタリングを行った後は機能しなくなりました。私は本当に違いを見ることができません。

KeySelector と ResultSelector を拡張して、ブレークポイントを配置できるようにしました。2 つの列挙型 (localSeq と remoteSeq) は正常に動作し、適切な数の要素を取得しています。両方のシーケンスの要素は Object() としてフォーマットされます。KeySelectors (関数 CompositeJoinKeySelector によって実装される) も機能するようです。この関数が行うことになっているのは、すべての要素から適切なフィールドを選択して、.Join メソッドが等しいかどうかを確認する方法を知ることです。失敗するのは、このステップ (等価性のチェック) のようです。

コードをステップ実行すると、linq クエリが両方のデータセットをループして KeySelector を実行します。これは意図した値を返すようです。ただし、その後、ResultSelector で中断されません。これは、一致する「行」が見つからなかったため、結果を処理する必要がなかったことを意味しているように思えます。これは非常に奇妙です。なぜなら、実行をステップ実行すると、両方の KeySelectors が 2 次元の 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()
4

1 に答える 1

0

さて、デフォルトで参照比較が使用されたため、比較が失敗したようです。そこで、IEqualityComparer を実装することで問題を解決しました。

于 2012-10-03T11:16:45.943 に答える