4

ASP.NET Web サービス プロジェクトにデータ テーブルがあります。このデータ テーブルには、39 列の約 500K レコードがあり、キャッシュに存在します。1 分後、バックグラウンド スレッドがデータベースにヒットし、キャッシュされたデータ テーブルで更新したいデータベースから更新レコードを取得します。次のアプローチを使用していますが、それを行うのに十分な時間がかかります。

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(N) ではなく O(log(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 に答える