我想知道是否有更聪明/更快/ 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);
答案 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);