实体框架多行更新

时间:2016-12-01 10:00:22

标签: c# wpf entity-framework

我想知道是否有更聪明/更快/ one_line的方法来解决这个问题。

我有一个包含IsActive属性的dll列表。在UI上我有复选框,它根据是否选中复选框来更改dll的状态。按钮单击时发生更改。我没有问题遍历整个数据库所以现在我这样做:

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

dllList是连接到WPF前端的List<>元素。)

所以现在我在DB中找到具有相同id的元素,并将其状态更改为UI复选框中显示的状态。

解决方案我喜欢这样的事情:

context.dllSet.AddOrUpdateList(dllList);

2 个答案:

答案 0 :(得分:0)

使用 Datatabel 作为参数创建存储过程,并在数据库结束时实现逻辑。

从实体框架调用您的存储过程。

答案 1 :(得分: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);