4

我的 ASP.NET Web 服务项目中有一个数据表,该数据表中有大约 50 万条记录,有 39 列,并且存在于缓存中。一分钟后,后台线程访问数据库并从数据库中获取更新记录,我想在缓存数据表中更新这些记录,我正在使用以下方法,但它需要足够的时间来完成:

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可以使用其他方法。

4

3 回答 3

1

你可以这样试试

dtOriginal.Merge(dtNew);
于 2012-07-18T12:46:19.923 回答
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());
}
);
于 2014-05-21T00:32:14.003 回答
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"]; 
     }
} 
于 2012-07-18T13:12:37.847 回答