Entity Framework 6 Где в массовом обновлении / удалении в одной транзакции

В EF6 я хочу обновлять / удалять объемные данные в одном запросе. Мой код

using (var context = _dataContextFactory.GetContext()) { var result1 = from b in context.MyTables where new List {592, 593, 594}.Contains(b.Id) select b; foreach (var item in result1 ) { item.StatusId = 3; } context.SaveChanges(); } 

Но в 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 

возможно ли получить сценарий с предложением 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 } 

NB: может быть более эффективный способ написать это, но я все еще играю с библиотекой. Однако он компилируется до одного оператора SQL, а в библиотеку также включены удаленные DELETE.

Наконец, не беспокойтесь о new выражении. Любые свойства, которые здесь не указаны, сохранят свои первоначальные значения.

Вы не можете обновлять несколько строк в одном вызове SQL с помощью EF.

Вместо этого вы можете написать хранимую процедуру, которая будет эффективно работать для вас. Или используйте стороннюю библиотеку, которая предоставляет расширения EF для этого.

Конечно, это не имеет смысла, если количество обновляемых строк действительно мало.