将两个数据表合并为一个C#

时间:2015-07-16 21:16:37

标签: c# datatable merge

我有一个简单的问题,但我无法解决它,问题是每次我合并两个数据表合并出来看起来很滑稽,表1在表二之上,我知道这是因为我没有设置列的主键,但是当我突然发生时我得到错误,因为在Enitity列中有重复值。如何通过,知道主键列中将出现重复值

private void button1_Click(object sender, EventArgs e)
            {
                DataTable merge = new DataTable() ;
                merge.Merge(t1());
                merge.Merge(t2());
                gridControl1.DataSource = merge.DefaultView;
            }
            public DataTable t1()
            {
                DataColumn col;

                DataTable d = new DataTable();
                d.Columns.Add("Enitity");

                d.PrimaryKey = new DataColumn[] { d.Columns["Enitity"] };
                //d.PrimaryKey = null;
                d.Columns.Add("Variable");
                d.Rows.Add(new string []{"K1","100"});
                d.Rows.Add(new string[] { "K1", "200" });
                d.Rows.Add(new string[] { "K3", "300" });
                d.Rows.Add(new string[] { "K4", "400" });
                d.Rows.Add(new string[] { "K6", "500" });
                d.Rows.Add(new string[] { "K5", "600" });
                return d;
            }
            public DataTable t2()
            {
                DataColumn col;
                DataTable d = new DataTable();
                d.Columns.Add("Enitity"); 
                d.PrimaryKey = new DataColumn[] { d.Columns["Enitity"] };
                d.PrimaryKey = null;
                d.Columns.Add("Variable2");
                d.Rows.Add(new string[] { "K1", "1000" });
                d.Rows.Add(new string[] { "K2", "2000" });
                d.Rows.Add(new string[] { "K3", "3000" });
                d.Rows.Add(new string[] { "K4", "4000" });
                d.Rows.Add(new string[] { "K5", "5000" });
                d.Rows.Add(new string[] { "K7", "6000" });
                return d;

            }

这就是我的Merge看起来像

Enitty      Variable       Variable 2
---------     -----        -----------
K1              .
K2              .
K3              .
K4              .
.
.
.
K1                             .
K2                             .
K3                             .
K4
.
.
.

2 个答案:

答案 0 :(得分:1)

如上所述,您无法设置主键,因为您有重复的值。你可能最好使用linq,比如:

        DataTable myNewDataTable = new DataTable();
        myNewDataTable.Columns.Add("Enitity", typeof(string));
        myNewDataTable.Columns.Add("Variable", typeof(string));
        myNewDataTable.Columns.Add("Variable2", typeof(string));
        var results = (from d1 in t1().AsEnumerable()
                       join d2 in t2().AsEnumerable()
                             on d1.Field<string>("Enitity") equals d2.Field<string>("Enitity")
                       select myNewDataTable.LoadDataRow( new object[] { d1.Field<string>("Enitity"), d1.Field<string>("Variable"), d2.Field<string>("Variable2") }, true) );
        myNewDataTable = results.CopyToDataTable<DataRow>();

答案 1 :(得分:0)

嗯,问题是您不想合并,要合并,并且没有自动功能(那个)我知道。)

首先,你需要设置主键---没有它,就无法知道第一个表中的“K1”想要与第二个表中的“k1”合并。

除此之外,据我所知,你必须手动进行实际的合并。将Table1复制到新的DataTable,添加额外的列。然后单步执行Table2,在合并表中查找每个键,然后添加新字段。

更新:这应该适合你:

DataTable merge = new DataTable() ;
merge.Merge(t1());
merge.Columns.Add("Variable2");
foreach(DataRow dr in t2().Rows)
{
    var old = merge.Select(string.Format("Enitity='{0}'", dr["Enitity"]) );
    if (old.Any())
        old[0]["Variable2"] = dr["Variable2"];
    else
          merge.Rows.Add(new string []{
                             dr["Enitity"] as string,
                             null, 
                             dr["Variable2"]as string});

}