我有一个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或任何人有效地实现这一点,请建议我达到此要求的最佳方法。
答案 0 :(得分: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),则会出现异常,因为两列可能不会同时具有相同的名称。