我的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
或其他方法。
答案 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"];
}
}