Как я могу скопировать записи таблицы данных с другим именем поля на основе списка сопоставления, оценивающего условие в таблице исходных данных?

У меня есть таблица исходных данных типа 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

Основным недостатком является то, что здесь у меня есть минимум 40 тыс. записей в исходной таблице данных, и данные невозможно получить из базы данных, поскольку все изменения с данными фиксируются только тогда, когда пользователь сохраняет свою работу. Сгенерированная целевая таблица назначается в качестве источника данных для управления сеткой и отчета для предварительного просмотра.

Как я могу добиться этого эффективно, используя Linq, или кто-нибудь, пожалуйста, предложите мне лучший способ выполнить это требование.


person binarymnl    schedule 30.09.2012    source источник
comment
пожалуйста, сначала исправьте свой вопрос. Грамматика плохая для того, чтобы задавать вопрос   -  person User 1531343    schedule 30.09.2012
comment
@BhavikKama - я сомневаюсь, что ОП является носителем английского языка, и, хотя это не лучшая грамматика, я читал здесь, на SO, гораздо хуже. Его вопрос понятен, ИМО.   -  person Tim    schedule 30.09.2012
comment
LINQ не обязательно будет быстрее. Он предоставляет ярлыки, поэтому вам не нужно записывать цикл For, но в сгенерированном байтовом коде все еще есть повторение цикла for.   -  person JDB still remembers Monica    schedule 08.10.2012


Ответы (1)


Я не пробовал это, поэтому я не могу точно сказать, что это будет быстрее, но мне кажется, что вы получите гораздо лучшую скорость, используя что-то вроде следующего:

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

ПРИМЕЧАНИЕ. Этот метод завершится ошибкой, если несвязанный столбец является частью отношения или выражение другого столбца зависит от этого столбца. Кроме того, если вы поменяете имена двух столбцов (например, A будет называться B, а B будет называться A), вы получите исключение, поскольку два столбца не могут иметь одинаковое имя одновременно.

person JDB still remembers Monica    schedule 08.10.2012