C# Linq: Join两个DataTable
2015年06月15日 22:37:18 baidu_20993761 阅读数 4437
方案一:当能够确定DtAll表的字段,并且字段不是很多的情况下,可以显式写出:
var query1 =
from rHead in dtHead.AsEnumerable()
from rTail in dtTail.AsEnumerable()
where rHead.Field<Int32>('GoodID') == rTail.Field<Int32>('GoodID')
select new {
GoodID = rHead.Field<Int32>('GoodID'),
GoodName = rHead.Field<String>('GoodName'),
Num = rTail.Field<Int32>('Num'),
Money = rTail.Field<Int32>('Money')
};
DataTable dtNew = DtAll.Copy();
foreach (var obj in query1) {
dtNew.Rows.Add(obj.GoodID, obj.GoodName, obj.Num, obj.Money);
}
其中DtAll的表结构已经事先创建好了,在下面会给出所有代码。
方案二:LINQ提供了与SQL中类似的JOIN方法。并且当字段很多的情况下,每一个字段都在select new中写出来比较麻烦,可以使用如下的方式:
var query =
from rHead in dtHead.AsEnumerable()
join rTail in dtTail.AsEnumerable()
on rHead.Field<Int32>('GoodID') equals rTail.Field<Int32>('GoodID')
select rHead.ItemArray.Concat(rTail.ItemArray.Skip(1));
foreach (var obj in query){
DataRow dr = DtAll.NewRow();
dr.ItemArray = obj.ToArray();
DtAll.Rows.Add(dr);
}
使用Concat将表1和表2的字段拼接起来,作为总表DtAll的字段,但由于表1、表2中都存在字段GoodID,不能在表中出现重复的字段,因此使用Skip(1)跳过表2中的第一个字段GoodID。