3

我有一个 System.Data.DataTable 类型的源数据表,我必须从中生成映射列的目标数据表(考虑映射列的相同 SqlDBType。)

我有一个 MappingInfo 类的列表,其中每个 Source Datatable Column 都映射为 New Column Name,它将位于目标数据表中。

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

注意:如果未映射的列是关系的一部分或另一列的表达式依赖于该列,则此方法将失败。此外,如果您要交换两列的名称(例如,A 将被命名为 B,B 将被命名为 A),那么您将得到一个异常,因为两列可能不会同时具有相同的名称。

于 2012-10-08T16:52:22.620 回答