我有一个简单的问题,但我无法解决它,问题是每次我合并两个数据表合并出来看起来很滑稽,表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
.
.
.
答案 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});
}