【问题标题】:Two DataTables merge with different PrimaryKey set两个 DataTables 与不同的 PrimaryKey 集合并
【发布时间】:2014-05-13 15:37:29
【问题描述】:

我有两个数据表如下

TableA
-------------------------------------------
ParamId   | Code   | Val   | date_time
-------------------------------------------
1         A1       5.6     02.04.2014 00:00
1         A1       10      02.04.2014 01:00
1         A1       5.9     02.04.2014 02:00
1         A1       8       02.04.2014 03:00
1         A1       7       02.04.2014 04:00
1         A1       12      02.04.2014 05:00


TableB
-------------------------------------------
ParamId   | Code   | Val   | date_time
-------------------------------------------
1         A2       5.6     02.04.2014 00:00
1         A2       10      02.04.2014 01:00
1         A2       5.9     02.04.2014 02:00
1         A2       8       02.04.2014 03:00
1         A2       7       02.04.2014 04:00
1         A2       12      02.04.2014 05:00

Expected result:
-------------------------------------------
ParamId   | Code   | Val   | date_time
-------------------------------------------
1         A1       5.6     02.04.2014 00:00
1         A1       10      02.04.2014 01:00
1         A1       5.9     02.04.2014 02:00
1         A1       8       02.04.2014 03:00
1         A1       7       02.04.2014 04:00
1         A1       12      02.04.2014 05:00
1         A2       5.6     02.04.2014 00:00
1         A2       10      02.04.2014 01:00
1         A2       5.9     02.04.2014 02:00
1         A2       8       02.04.2014 03:00
1         A2       7       02.04.2014 04:00
1         A2       12      02.04.2014 05:00

即TableA 具有来自 dt 列的 PrimaryKey,结果表具有来自 dt 列和 Code 的 primaryKey。 我尝试 TableA.Merge(TableB);比循环中的 ResultTable.Merge(TableA) 。但在 ResultTable 我只有最后一个合并的表值。

【问题讨论】:

  • @wudzik 添加了有问题的 cmets
  • select * into new table(your new table name) from table1.col1,table1.col2,table2.col1,table2.col2;(必填列)
  • @JihedJaouabi 这是 LINQ?
  • 这是一个 sql 查询,但您可以将其转换为 LINQ sqltolinq.com
  • @JihedJaouabi 我有 C# 代码

标签: c# .net datatable merge


【解决方案1】:

您需要定义一个空的合并目标表并将所有其他表合并到该合并表中。所以不要预先合并任何表。您的代码将如下所示,数据表 merged 保存最终结果。在Merge 方法中,我使用 MissingSchemaAction.Ignore 来防止由于提供的数据集中的主键列之间可能不匹配而导致的空引用异常。

var one = BuildDataTable();
one.PrimaryKey = new DataColumn[] { one.Columns["code"]}; 

var row = one.NewRow();
row["id"] = "1";
row["code"] = 1;
row["val"] = 5.6;
row["date_time"] = DateTime.Now;
one.Rows.Add(row);


var two = BuildDataTable();
two.PrimaryKey = new DataColumn[] { two.Columns["date_time"] , two.Columns["code"]};

row = two.NewRow();
row["id"] = "1";
row["code"] = 2;
row["val"] = 3.0;
row["date_time"] = DateTime.Now.AddDays(1);
two.Rows.Add(row);

// merge table result
var merged = BuildDataTable();
merged.PrimaryKey = new DataColumn[] { 
                        merged.Columns["date_time"] , 
                        merged.Columns["code"]};

// for each table call merge on our merged table
merged.Merge(one, true, MissingSchemaAction.Ignore); 
merged.Merge(two, true, MissingSchemaAction.Ignore);
// continue calling Merge until all tables are done

建表的辅助方法

private DataTable BuildDataTable()
{
   var dt = new DataTable();
    //ParamId   | Code   | Val   | date_time
    dt.Columns.Add("id", typeof(string));
    dt.Columns.Add("code", typeof(int));
    dt.Columns.Add("val", typeof(double));
    dt.Columns.Add("date_time", typeof(DateTime));
    return dt;
}

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2014-02-15
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多