3

タイプ System.Data.DataTable のソース データ テーブルがあり、そこからマップされた列の宛先データ テーブルを生成する必要があります (マップされた列には同じ SqlDBType を考慮してください)。

各ソースデータテーブル列が宛先データテーブルにある新しい列名にマップされた MappingInfo クラスのリストがあります。

Public Class MappingInfo

    Public Property SourceFieldName As String
    Public Property DestinationFieldName As String

End Class

行データを宛先テーブルにコピーできるようにするには、ソース データテーブルの条件を評価する必要があります。

次のコード スニペットを使用してこれを行いました。

''Prepare destination table.

For Each oMapping In oMappingInfo  

            DestinationDataTable.Columns.Add( _
                New DataColumn(oMapping.DestinationFieldName))
        Next

        For Each oRow In SourceDataTable.Rows   ''Copy data.
            If oRow("IsActive") Then
                oDataRow = DestinationDataTable.NewRow
                For Each oMapping In oMappingInfo
                    oDataRow(oMapping.DestinationFieldName) = _
                        oRow(oMapping.SourceFieldName)
                Next
                DestinationDataTable.Rows.Add(oDataRow)
            End If
        Next

主な欠点は、ソース データ テーブルに最低 40k レコードがあり、ユーザーが作業を保存したときにのみコミットされたデータのすべての変更として、データベースからデータを取得できないことです。生成された宛先テーブルは、データ ソースとしてグリッド コントロールとプレビュー用のレポートに割り当てられています。

Linqを使用してこれを効率的に達成するにはどうすればよいですか、または誰かがこの要件を達成するための最良の方法を提案してください。

4

1 に答える 1

0

私はこれを試したことがないので、もっと速くなるかどうかはわかりませんが、次のようなものを使用すると、はるかに速い速度が得られるようです。

Dim l_destinationTable As DataTable
' This creates a copy of the structure and content
l_destinationTable = SourceTable.Copy()

For Each l_column As DataColumn in l_destinationTable.Columns
    Dim l_columnMap = oMappingInfo.FirstOrDefault( _
        Function (c) c.SourceFieldName = l_column.ColumnName )
    If l_columnMap IsNot Nothing Then
        ' Rename the column if it is mapped
        l_column.ColumnName = l_columnMap.DestinationFieldName
    Else
        ' Drop the column if it is not mapped
        l_destinationTable.Columns.Remove( l_column )
    End If
Next

注:マップされていない列が関係の一部である場合、または別の列の式がこの列に依存している場合、このメソッドは失敗します。また、2つの列の名前を入れ替える場合(たとえば、Aの名前はB、Bの名前はA)、2つの列の名前が同時にない場合があるため、例外が発生します。

于 2012-10-08T16:52:22.620 に答える