将两个数据表合并为一个 C#
Merging two Datatables into One C#
我有一个简单的问题但我无法解决它,问题是每次我合并两个数据tables 合并看起来很有趣,table 1 继续table 两个的顶部,我知道那是因为我没有设置列的主键,但是当我突然设置时,我得到了错误,因为实体列中有重复值。如何通过它,知道重复值将出现在主键列
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
.
.
.
嗯,问题是你不想合并table,你想合并行,并且没有自动功能(据我所知)。
首先,您需要设置主键---没有它,就无法知道第一个table中的"K1"要与[=24=合并] 从第二个 table.
除此之外,据我所知,您必须手动进行实际合并。将 Table1 复制到新的 DataTable,添加额外的列。然后遍历 Table2,查找合并中的每个键 table,并添加新字段。
更新:这应该适合你:
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>();
我有一个简单的问题但我无法解决它,问题是每次我合并两个数据tables 合并看起来很有趣,table 1 继续table 两个的顶部,我知道那是因为我没有设置列的主键,但是当我突然设置时,我得到了错误,因为实体列中有重复值。如何通过它,知道重复值将出现在主键列
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
.
.
.
嗯,问题是你不想合并table,你想合并行,并且没有自动功能(据我所知)。
首先,您需要设置主键---没有它,就无法知道第一个table中的"K1"要与[=24=合并] 从第二个 table.
除此之外,据我所知,您必须手动进行实际合并。将 Table1 复制到新的 DataTable,添加额外的列。然后遍历 Table2,查找合并中的每个键 table,并添加新字段。
更新:这应该适合你:
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>();