合并datatable
现在有三个表,如下
a1表:
字段1 字段2
a 111
b 222
a2表:
字段1 字段2
a 333
b 444
a3表:
字段1 字段2
a 555
b 666
怎样合并显示如下表呢
字段1 字段2 字段3 字段4
a 111 333 555
b 222 444 666
求方法
[解决办法]
先合并
1和2
然后得到的table再合并3
[解决办法]
表之间有没有可以关联的字段,如果没有的话,可以建立下,这样就可以使用Join来合并
[解决办法]
protected DataTable MergeDataTable(DataTable dt1, DataTable dt2, string KeyColName,bool isMergeAll)
{
//合并列
DataTable ndt1 = dt1.Copy();
DataTable ndt2 = dt2.Copy();
ndt2.PrimaryKey = new DataColumn[] { ndt2.Columns[KeyColName] };
for (int i = 0; i < ndt2.Columns.Count; i++)
{
if (ndt2.Columns[i].ColumnName.ToLower().Trim() != KeyColName.ToLower().Trim())
{
ndt1.Columns.Add(ndt2.Columns[i].ColumnName);
}
}
//合并相同主键的数据
for (int i = 0; i < ndt1.Rows.Count; i++)
{
DataRow inrow = ndt2.Rows.Find(ndt1.Rows[i][KeyColName]);
if (inrow != null)
{
for (int j = 0; j < ndt2.Columns.Count; j++)
{
if (ndt2.Columns[j].ColumnName.ToLower().Trim() != KeyColName.ToLower().Trim())
{
ndt1.Rows[i][ndt2.Columns[j].ColumnName] = inrow[ndt2.Columns[j].ColumnName];
}
}
if (isMergeAll)
{
ndt2.Rows.Remove(inrow);
}
}
}
if (isMergeAll)
{
//合并不同主键的数据
for (int i = 0; i < ndt2.Rows.Count; i++)
{
DataRow row = ndt1.NewRow();
for (int j = 0; j < ndt2.Columns.Count; j++)
{
row[ndt2.Columns[j].ColumnName] = ndt2.Rows[i][ndt2.Columns[j].ColumnName];
}
ndt1.Rows.Add(row);
}
}
return ndt1;
}
[解决办法]
用linq更简单一点。
DataTable dt1 = new DataTable();
dt1.Columns.Add("字段1", typeof(string));
dt1.Columns.Add("字段2", typeof(int));
dt1.Rows.Add("a", 111);
dt1.Rows.Add("b", 222);
DataTable dt2 = new DataTable();
dt2.Columns.Add("字段1", typeof(string));
dt2.Columns.Add("字段2", typeof(int));
dt2.Rows.Add("a", 333);
dt2.Rows.Add("b", 444);
DataTable dt3 = new DataTable();
dt3.Columns.Add("字段1", typeof(string));
dt3.Columns.Add("字段2", typeof(int));
dt3.Rows.Add("a", 555);
dt3.Rows.Add("b", 666);
var result = from x in dt1.AsEnumerable()
from y in dt2.AsEnumerable()
from z in dt3.AsEnumerable()
where x.Field<string>("字段1") == y.Field<string>("字段1")
&& x.Field<string>("字段1") == z.Field<string>("字段1")
select new
{
字段1 = x.Field<string>("字段1"),
字段2 = x.Field<int>("字段2"),
字段3 = y.Field<int>("字段2"),
字段4 = z.Field<int>("字段2"),
};