Vol*_*aşa 6 c# entity-framework-6
在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();
}
Run Code Online (Sandbox Code Playgroud)
但是在Sql Profiler中,有三个脚本
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
Run Code Online (Sandbox Code Playgroud)
是否可以在一个查询中使用Where In子句获取脚本?
Dav*_* R. 10
不幸的是,实体框架中不支持此功能.但是,您可以使用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
}
Run Code Online (Sandbox Code Playgroud)
注意:可能有一种更有效的方式来写这个,但我还在玩这个库.但是,它确实编译为单个SQL语句,并且该库还包括批处理的DELETE.
最后,不要担心new表达方式.此处未引用的任何属性将保留其原始值.
| 归档时间: |
|
| 查看次数: |
9297 次 |
| 最近记录: |