2016-12-01 7 views
0

これにアプローチするスマート/高速/ one_lineの方法があるのだろうかと思っていました。エンティティフレームワークの複数行の更新

私はIsActiveのプロパティを持つdllのリストを持っています。 UIにはチェックボックスがチェックされているかどうかによってdllの状態が変わるチェックボックスがあります。変更はボタンクリックで発生します。

foreach (var item in dllList) 
{ 
    context.dllSet.Find(item.Id).IsActive = item.IsActive; 
} 

dllListは、WPFのフロントに接続List<>要素である):私は今、私はこのようにそれをやって全体DBを横断何の問題もありません。

これで、DB内に同じIDの要素が見つかり、その状態をUIチェックボックスに表示されているものに変更しています。

context.dllSet.AddOrUpdateList(dllList); 
+1

かもしれない便利http://stackoverflow.com/questions/11421370/efficient-更新されたエンティティのリスト – Vladimir

+1

について:context.dllSet.Where(a => dllList.Contains(a.Id))。ToList()。ForEach(a => a.IsActive = dllList.Find (a.Id).IsActive)。 –

+0

想像以上にエレガントではありませんが、いくつかの変更を加えて作業しています:) – Norgul

答えて

0

がパラメータとしてDatatabelストアドプロシージャのを作成し、DB側のロジックを実装します。私が好きな

ソリューションは、このようなものになるだろう。

エンティティ・フレームワークからストアド・プロシージャを呼び出します。

0

最速の方法は、バッチ更新をサポートするライブラリを使用している

参照:Entity Framework Batch Update Library

免責事項:私はプロジェクトEntity Framework Plus

var idsTrue = list.Where(x => x.IsActive).Select(x => x.Id).ToList(); 
var idsFalse = list.Where(x => !x.IsActive).Select(x => x.Id).ToList(); 

ctx.dllSet.Where(x => idsTrue.Contains(x.Id)).Update(x => new Dll() {IsActive = true}); 
ctx.dllSet.Where(x => idsFalse.Contains(x.Id)).Update(x => new Dll() {IsActive = false}); 

の持ち主です免責事項:私はEntity Framework Extensions

もう一つの方法は、一括操作を使用して、唯一のisActive列を変更しているプロジェクトの所有者だ

// Update all columns 
ctx.BulkUpdate(list); 

// Update only IsActive column 
ctx.BulkUpdate(new List<Dll>(), operation => operation.ColumnInputExpression = dll => new { dll.Id, dll.IsActive}); 

// Add new entities, update existing entities 
ctx.BulkMerge(list); 
関連する問題