Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
複数のDBMSから取得したDataTable比較
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=25968#CommentId69553
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
YUU
 (社会人)
投稿日時
2015/12/8 18:07:49
現在OracleとSqlserverから取得したDataTableを比較するプログラムを作成しております。
Oracleデータ ⇒ DataTable1
Sqlserverデータ ⇒ DataTable2
このご時世Entity Frameworkをなぜ使わぬといった話ですが今回はDataTableにて比較を行いたいと考えております。
http://qa.atmarkit.co.jp/q/9488
上記サイトを参考にLinq ラムダ式にて一つ一つループで回して比較するすべから逃れられそうなのですが如何せんC#の文法に苦戦しております。
現在最後に回答されている方の方式を.netの文法に置き換えているのですが置き換え方が分からない文法が有ります。(1人目の方はできました。)
Class DataRowComparer
Implements IEqualityComparer(Of DataRow)
Public Overloads Function Equals(x As DataRow, y As DataRow) As Boolean Implements IEqualityComparer(Of System.Data.DataRow).Equals
Return Object.ReferenceEquals(x, y) OrElse (x IsNot Nothing AndAlso y IsNot Nothing AndAlso CompareAllColumns(x, y))
End Function
Private Function CompareAllColumns(x As DataRow, y As DataRow) As Boolean
Dim intColumns As String() = New String() {"ID"}
Return New String() {"ID", "Name"}.Select(Function(name) New With {.Name = name,
.X = x(name),
.Y = y(name),
.IsInt = intColumns.Contains(name)}).Aggregate(True, Function(acc, succ)
'下記のコメントアウト部分です。
'if (DBNull.Value.Equals(succ.X) || DBNull.Value.Equals(succ.Y)) return acc && (succ.X?.Equals(succ.Y) ?? false);
If succ.IsInt Then
Return acc AndAlso (CInt(succ.X) = CInt(succ.Y))
End If
Return acc AndAlso (succ.X Is succ.Y)
End Function)
End Function
Public Overloads Function GetHashCode(obj As DataRow) As Integer Implements IEqualityComparer(Of System.Data.DataRow).GetHashCode
If obj Is Nothing Then
Return 0
End If
Dim idHashCode As Integer = If(obj("ID") Is Nothing, 0, obj("ID").GetHashCode())
Dim nameHashCode As Integer = If(obj("Name") Is Nothing, 0, obj("Name").GetHashCode())
Return idHashCode Xor nameHashCode
End Function
End Class
上記のコメントアウト部分以外は.net文法に直せたかと思うのですがコメントの部分のみうまく変換できません。(それら以外は多分できたのかな?)
お力を貸していただけると幸いです。