2016-12-01 63 views
0

我想知道是否有更智能/更快/ one_line的方式來解決這個問題。實體框架多行更新

我有一個DLL列表IsActive屬性。在UI上,我有複選框,它會根據複選框是否被選中來改變dll的狀態。單擊按鈕時發生更改。我沒有問題,遍歷整個DB所以我現在做這樣的:

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

dllList是連接到WPF前List<>元素)。

因此,現在我在數據庫中找到具有相同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);