通常都是使用SQL直接从数据库中取出表1和表2关联查询后的数据,只需要用一个JOIN就可以了,非常方便。近日遇到一种情况,两个表中的数据已经取到代码中,需要在代码中将这两个表关联起来,并得到它们横向拼在一起之后的完整数据。
使用LINQ可以帮助解决这一问题。下面提供了两种方案:
方案一:当能够确定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。
|