gpt4 book ai didi

c# - Entity Framework 6 在一次事务中批量更新/删除的位置

转载 作者:太空狗 更新时间:2023-10-29 21:12:38 28 4
gpt4 key购买 nike

在 EF6 中,我想在一个查询中更新/删除批量数据。我的代码是

 using (var context = _dataContextFactory.GetContext())
{
var result1 = from b in context.MyTables
where new List<int> {592, 593, 594}.Contains(b.Id)
select b;


foreach (var item in result1 )
{
item.StatusId = 3;
}

context.SaveChanges();

}

但是在Sql Profiler中,有3个脚本

exec sp_executesql N'UPDATE [dbo].[MyTable] SET [StatusId] = @0 WHERE ([Id] = @1) ',N'@0 int,@1 int',@0=1,@1=592
exec sp_executesql N'UPDATE [dbo].[MyTable] SET [StatusId] = @0 WHERE ([Id] = @1) ',N'@0 int,@1 int',@0=1,@1=593
exec sp_executesql N'UPDATE [dbo].[MyTable] SET [StatusId] = @0 WHERE ([Id] = @1) ',N'@0 int,@1 int',@0=1,@1=594

是否可以在一个查询中获取带有 Where In 子句的脚本?

最佳答案

不幸的是,开箱即用的 Entity Framework 不支持这一点。但是,您可以使用 EntityFramework.Extended 库中的批量更新功能:

https://github.com/loresoft/EntityFramework.Extended

还有一个 nuget 包可用。

一个例子是:

using EntityFramework.Extensions;

...

int[] myIds = { 592, 593, 594 };

using (var context = _dataContextFactory.GetContext())
{
// Define a filter expression to retrieve matching items
var filter = context.MyTables.Where(item => myIds.Contains(item.Id));
// Update the StatusId of matched items
context.MyTables.Update(filter, i => new Item { StatusId = 3 });

// NB: no context.SaveChanges() required
}

注意:可能有更有效的写法,但我仍在使用库。但是,它确实会编译成单个 SQL 语句,并且该库还包括批处理的 DELETE。

最后,不用担心 new 表达式。此处未引用的任何属性将保留其原始值。

关于c# - Entity Framework 6 在一次事务中批量更新/删除的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28584523/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com