2016-12-01 61 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);