两datatable数据集关联,实现inner join或left join效果

今日遇到一个开发任务,是两个查询出的datatable,要像sql左关联查询,读取左边datatable所有列及dt2的列DeliveryMode
想到的第一种方法是在dbData中增加一列,然后循环dbData,再自dt2中读取相应值然后赋值到新加的列中。实现方法如下:


System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
#region 第一种实现方法
sw.Start();
dbData.Columns.Add("DeliveryMode", typeof(string));
for (int i = 0; i < dbData.Rows.Count; i++)
{
    var query = from g in dt2.AsEnumerable()
where g.Field<string>("partcode") == dbData.Rows[i]["partcode"].ToString()
select g.Field<string>("DeliveryMode");
    var DeliveryMode = query.SingleOrDefault();
    dbData.Rows[i]["DeliveryMode"] = DeliveryMode;
}
json = JsonConvert.SerializeObject(dbData);
sw.Stop();
SHPJ.Common.NlogHelper.LogInfo("第一种方法执行时间:" + sw.Elapsed.TotalSeconds + "秒");
#endregion


第二种实现方法是使用linq to datatable,因为以前没用过,在实现过程中遇到问题不少。其实就是关联查询,然后把列值赋给新对象
#region 第二种实现方法
sw.Restart();
var query1 = from a in dbData.AsEnumerable()
    join b in dt2.AsEnumerable() on a.Field<string>("partcode") equals b.Field<string>("partcode") into abjoin
    from x in abjoin.DefaultIfEmpty()
    select new
    {
isgift = a.Field<bool?>("isgift"),
orderno = a.Field<Guid>("orderno").ToString(),
idname = a.Field<string>("idname"),
sureamount = a.Field<double?>("sureamount"),
price = a.Field<double?>("price"),
partstatus = a.Field<int?>("partstatus"),
DeliveryMode = x == null ? "" : x["DeliveryMode"]
    };
json = JsonConvert.SerializeObject(query1.ToList());
sw.Stop();
SHPJ.Common.NlogHelper.LogInfo("第二种方法执行时间:" + sw.Elapsed.TotalSeconds + "秒");
#endregion


这两个方法第二种代码量比较大,尤其是表中字段过多时,那写select new的时候简直是灾难,而且字段的类型必须严格的和数据库类型一致,差一点都不行。如果第二种有其他的比较好写的减少代码量的方法,还是倾向于第二种方法。感觉第一种由于使用循环获取,数据量大的情况效率应该比第二种的差。但是实际测试发现,在数百条记录的情况下,第二种只比第一种快几毫秒,可以忽略不计

猜你喜欢

转载自blog.csdn.net/sxf359/article/details/80949358