更新が必要なGUID(100,000以上)のローカルリストがあります。linqを使用してSQLに特定の列を更新
今私は、簡単な使用しています:
foreach(var id in GUIDs)
{
var objToUpdate = dataContext.table.Single(o=>o.id==id);
objToUpdate.val1=...
objToUpdate.val2=...
...
}
dataContext.SubmitChanges();
このソリューションは非常に遅いです。 Singleメソッドを呼び出すたびに、レコード全体がDBから取得されます(プライマリキー以外のすべてのデータを上書きするため、レコードの必要はありません)。
本当に必要な2つの列しか取得できない方法はありますか? (主キーと他の1つの列)?
私はこのような何か行うと:
dataContext.table.Select(o =>
new sqlRecord
{
PrimaryKey = o.PrimaryKey,
AnotherCol = o.AnotherCol
}
);
を私はエラーを取得:
Explicit construction of entity type '{0}' in query is not allowed.
は、ストアドプロシージャを使用することはオプションではありません。正しいデータ値の設定は、外部リソースに応じて非常に複雑です。
var query = dataContext.table.Where(o => GUIDs.Contains(o.id));
foreach(var objToUpdate in query)
{
objToUpdate.val1 =...;
objToUpdate.val2 = ...;
}
dataContext.SubmitChanges();
私はGUIDのトンを持っていながら、これは、私が2100を超えるパラメータを使用していること、エラーが発生します。
(from ids in dataContext.fn_getGuidsFromString(String.Join("", GUIDs)) join o in dataContext.table on ids.id equals o.PrimaryKey select o)
fn_getGuidsFromStringは、表関数は、SQLにあります。このため
、私は代替手段を使用しています。これはwhereとContainsを使う方が良いでしょう。私の問題は、この動作が遅すぎるということです。この表には200以上の列があり、そのうちのいくつかは多くのデータを持つテキストであることを知っていなければなりません。
dataContext.table.Single(o=>o.id==id).select(o=>new {o.id, o.anotherCol});
が、これで私はレコードを更新することはできません。
dataContext.table.Single(o=>o.id==id);
は(データに応じて)この後、約20倍遅くなります。
ご意見はありますか? よろしく
一括アップデートを使用しようとすると、あなたの場合ストア手順を使用する必要があります。 http://stackoverflow.com/questions/17274430/efficient-way-to-do-bulk-insert-update-withentent-framework – Chandru
私はあなたのコードのどのラインが時間のかかるものかを判断するためにストップウォッチを使用することを推奨します。そこから改善の方向に進むことができます。 – Niklas
ここをクリックしてください:http://stackoverflow.com/questions/8223942/linq2sql-select-only-some-column-but-stillable-to-submit-changes – astidham2003