从另一个数据表更新数据表中数据的有效方法

时间:2012-07-18 12:42:01

标签: c# datatable performance

我的ASP.NET Web服务项目中有一个数据表,这个数据表中有大约500K记录,其中有39列,并且存在于Cache中。 一分钟后,后台线程命中数据库,并从数据库中获取更新记录,我想在缓存数据表中更新,我使用了以下方法,但是它花了足够的时间来完成它:

foreach (DataRow dRNew in dtNew.Rows)
{
     DataRow row = dtOriginal.Select("ID=" + dRNew["ID"]).First();
     row["Column1"] = dRNew["Column1"];
     row["Column2"] = dRNew["Column2"];
     row["Column3"] = dRNew["Column3"];
}

我已更换以下内容:

DataRow row = dtOriginal.Select("ID=" + dRNew["ID"]).First();

DataRow row = dtOriginal.AsEnumerable().Where(r => ((Int64)r["ID"]).Equals(dRNew["ID"])).First();

但是徒劳无功,我的笔记本电脑花了大约5分钟。

任何人都可以指导我在哪里以及我做错了什么?我可以使用哪种方法有效地执行此操作,但我不确定是否可以使用Dataset.Merge或其他方法。

3 个答案:

答案 0 :(得分:1)

你可以这样试试

dtOriginal.Merge(dtNew);

答案 1 :(得分:1)

我原本以为使用它会更快:

TableToUpdate.AsEnumerable().Join
(
    TableToUpdateFrom.AsEnumerable(),
    lMaster => lMaster["COMMON_FIELD"], lChild => lChild["COMMON_FIELD"],
    (lMaster, lChild) => new { lMaster, lChild }
    ).ToList().ForEach
(
o =>
{
    o.lMaster.SetField("FIELD_TO_BE_UPDATED1", o.lChild["FIELD_TO_BE_UPDATED_FROM1"].ToString());
    o.lMaster.SetField("FIELD_TO_BE_UPDATED2", o.lChild["FIELD_TO_BE_UPDATED_FROM2"].ToString());
    o.lMaster.SetField("FIELD_TO_BE_UPDATED3", o.lChild["FIELD_TO_BE_UPDATED_FROM3"].ToString());
    o.lMaster.SetField("FIELD_TO_BE_UPDATED_ETC", o.lChild["APPROVAL_SCORE_FROM_ETC"].ToString());
}
);

答案 2 :(得分:0)

尝试使用此方法,DataRowCollection.Find。假设您正确设置了DataTable,它将是O(log(n))而不是当前的O(N)。

foreach (DataRow dRNew in dtNew.Rows) 
{
     DataRow row = null;
     try
     {
         row = dtOriginal.Find(dRNew["ID"]);
     }
     catch (MissingPrimaryKeyException)
     {
         row = dtOriginal.Select("ID=" + dRNew["ID"]).First();
     }
     if (row != null)
     {
         row["Column1"] = dRNew["Column1"]; 
         row["Column2"] = dRNew["Column2"]; 
         row["Column3"] = dRNew["Column3"]; 
     }
}