合并两个数据表数组C#

时间:2013-06-06 21:59:52

标签: c# join merge

我有两个数据表数组

  DataTable[] DTrightSplitH2;
  DataTable[] DTleftSplitH2;

我尝试做的是将每个数据表放在DTright中并与“key”列中的DTleft进行比较 它们是相同的,合并行

我知道我应该使用DataTable.Merge并将bool设置为false并添加缺少的架构,但我不能让它像我想要的那样工作

2 个答案:

答案 0 :(得分:0)

试试这个:

DTrightSplitH2.Union(DTleftSplitH2);

答案 1 :(得分:0)

听起来好像可以使用我的MergeAll方法(以下用法)。

public static DataTable MergeAll(this IList<DataTable> tables, String primaryKeyColumn)
{
    if (!tables.Any())
        throw new ArgumentException("Tables must not be empty", "tables");
    if(primaryKeyColumn != null)
        foreach(DataTable t in tables)
            if(!t.Columns.Contains(primaryKeyColumn))
                throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn");

    if(tables.Count == 1)
        return tables[0];

    DataTable table = new DataTable("TblUnion");
    table.BeginLoadData(); // Turns off notifications, index maintenance, and constraints while loading data
    foreach (DataTable t in tables)
    {
        foreach (DataColumn col in t.Columns) 
            col.ReadOnly = false; // required e.g. if you use a DataSet with Foreign-Key Constraints
        table.Merge(t); // same as table.Merge(t, false, MissingSchemaAction.Add);
    }
    table.EndLoadData();

    if (primaryKeyColumn != null)
    {
        // since we might have no real primary keys defined, the rows now might have repeating fields
        // so now we're going to "join" these rows ...
        var pkGroups = table.AsEnumerable()
            .GroupBy(r => r[primaryKeyColumn]);
        var dupGroups = pkGroups.Where(g => g.Count() > 1);
        foreach (var grpDup in dupGroups)
        { 
            // use first row and modify it
            DataRow firstRow = grpDup.First();
            foreach (DataColumn c in table.Columns)
            {
                if (firstRow.IsNull(c))
                {
                    DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c));
                    if (firstNotNullRow != null)
                        firstRow[c] = firstNotNullRow[c];
                }
            }
            // remove all but first row
            var rowsToRemove = grpDup.Skip(1);
            foreach(DataRow rowToRemove in rowsToRemove)
                table.Rows.Remove(rowToRemove);
        }
    }

    return table;
}

用法:

var tables = DTrightSplitH2.Concat(DTleftSplitH2).ToArray();
DataTable TblUnion = tables.MergeAll("key");