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

C# 将两个数据表合并为一个C,c#,datatable,merge,C#,Datatable,Merge,我有一个简单的问题,但我无法解决它,问题是每次我合并两个数据表时,合并结果看起来很有趣,表1位于表2之上,我知道这是因为我没有设置列的主键,但是,当我突然这样做时,我得到了错误,因为在ENITY列中有重复的值。知道重复的值将出现在主键列中,如何通过该操作 private void button1_Click(object sender, EventArgs e) { DataTable merge = new DataTable() ;

我有一个简单的问题,但我无法解决它,问题是每次我合并两个数据表时,合并结果看起来很有趣,表1位于表2之上,我知道这是因为我没有设置列的主键,但是,当我突然这样做时,我得到了错误,因为在ENITY列中有重复的值。知道重复的值将出现在主键列中,如何通过该操作

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;

            }
这就是我合并的样子

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

好吧,问题是你不想合并表,你想合并行,而且据我所知没有一个自动的函数

首先,您需要在没有主键的情况下设置主键,无法知道第一个表中的K1想要与第二个表中的K1合并

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

更新:这应该适合您:

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});

}

如上所述,您不能设置主键,因为您有重复的值。您最好使用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>();

PrimaryKey不能有重复项,否则就不再是PrimaryKey感谢回复,但是我知道它必须没有重复项,但是我如何解决这个问题我希望我的Entity列被合并,您希望您的输出是什么?有三列的桌子?Enity,Variable和Variable2?如果是这种情况,您计划如何绘制K1的情况?我的意思是表2中的K1行的Variable2设置为1000,表1中带有K1的两行中的哪一行应该与表2中的行合并?是的,先生,我的输出应该与您提到的完全一样。我将如何进行合并的部分是我无法理解的,谢谢你的评论。你确定第二个表可以在Enitity上有一个主键吗?我的意思是没有重复项存在?如果只进行一次合并,然后将连接的输出保存到第三个表,不是更好吗。这就是OP真正想要做的,C等价于SQL select t1.ENITY,t1.Variable,t2.Variable2,从t1上的t1内部联接t2选择t1.ENITY=t2.Enitty。如果第二个表中有多个K3,会发生什么?结果将忽略第二行,并始终更新第一行中的第一个K3行table@Steve-不可能发生,因为实体是主键没有dupsA部分,因为您无法将CopyToDataTable应用于结果。第二个表中的行K2和K7会发生什么情况?两个K1将有1000个bothI,我假设他实际上想要使用sql术语加入表。。。这就是我所期望的,因为他试图指定Enitity作为主键。。。我知道当你认为在两个已经存在的表中可能有重复时会变得更复杂…但我没有问这个问题“_ツ_/''这取决于所需的行为,内部连接、左外部连接、右外部连接、完全外部连接,如果这正是他想要的,但示例是内部连接。