我有一个数据表列表。将它们组合到单个数据表中的最有效方法是什么?这些数据表中的每一个的架构都不同,并且这些表的行数可能会有所不同。
IE
表 1 有 A、B 列
表 2 有 C、D 列
表 3 有 E、F 列
我的输出应该是一个包含所有上述列的结果表,并且应该包含所有行。
几行代码就可以实现吗?可以选择 LINQ 吗?
用了Merge
方法。请参阅http://msdn.microsoft.com/en-us/library/fk68ew7b.aspx。
根据您的评论更新。如果每个表中只有两列,则无法Merge
按预期使用该方法。
要执行您想要的操作,您需要在每个表上都有一个主键。当一行在表之间有一个共同的标识符时,列将被合并,而不是添加一行。例如,如果 RowId 1 在 Table1 和 Table 2 中,您将得到 RowId 1;A、B、C、D、空、空。如果 RowId 2 仅在 Table1 中,那么您将获得 RowId2;A,B,空,空,空,空。
http://msdn.microsoft.com/en-us/library/system.data.missingschemaaction.aspx
用户可以在每个 DataTable 上显式设置主键约束。这可确保与现有记录匹配的传入记录被更新而不是追加。
解决我上面的问题:
DataColumn[] keys = new DataColumn[1];
DT.Columns.Add(primaryColumn, typeof(System.Int32));
for (int i = 0; i < DT.Rows.Count; i++)
{
DT.Rows[i][primaryColumn] = i;
}
keys[0] = DT.Columns[primaryColumn];
mapDT.PrimaryKey = keys;
tables.Add(DT);
private static DataTable MergeDataTables(List<DataTable> tables, string keyColumn)
{
DataTable mergedTable = new DataTable();
foreach (DataTable dt in tables)
mergedTable.Merge(dt);
mergedTable.PrimaryKey = null;
mergedTable.Columns.Remove(keyColumn);
return mergedTable;
}
希望有帮助。