Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1315. #ЧтоНовенького Bulk-Операции в Entity Framework 7 В EF наконец завезут Bulk-Update и Bulk-Delete. Добавленные методы улучшают производительность. Теперь мы можем делать обновления и удаления с помощью всего одной операции, результатом которой будет одна команда SQL. Рассмотрим использование этих операций. Допустим, у нас есть класс людей:
public class Person
{
  public long Id { get; set; }
  public string Name { get; set; }
  public int Age { get; set; }
}

ExecuteDelete Чтобы массово удалить набор сущностей, отфильтруем их с помощью Where (как раньше), а затем вызовем ExecuteDelete. Помимо прочего, метод возвращает количество удалённых записей:
var personsDeleted = context.Persons
  .Where(p => p.Name.Contains("L"))
  .ExecuteDelete();

Вот какой код SQL он сгенерирует:
DELETE FROM [p]
FROM [Persons] AS [p]
WHERE [p].[Name] LIKE N'%L%'
Как видите, он просто генерирует одну инструкцию SQL для удаления сущностей, соответствующих условию. ExecuteUpdate Для обновления сущностей нам нужно использовать новый метод SetProperty. Первый аргумент SetProperty выбирает свойство, которое необходимо обновить с помощью лямбда-выражения, а второй аргумент — это новое значение этого свойства также с помощью лямбда-выражения, в котором мы также можем получать доступ к свойству. Например, здесь мы добавим префикс "New" к имени первой тысячи людей:
var personsUpdated =
  context.Persons
    .Where(p => p.PersonId <= 1_000)
    .ExecuteUpdate(
      p => p.SetProperty(
        x => x.Name,
        x => "New" + x.Name)
    );
}

В результате возвращается количество обновлённых записей, а SQL код получается таким:
UPDATE [p]
 SET [p].[Name] = N'New' + [p].[Name]
FROM [Persons] AS [p]
WHERE [p].[Id] <= CAST(1000 AS bigint)

Чтобы обновить несколько свойств за раз, просто вызовите методы SetProperty в цепочке:
….ExecuteUpdate(p =>
   p.SetProperty(x => x.Name, x => "…")
    .SetProperty(x => x.Age, x => 42)
  );
}

Источник: https://timdeschryver.dev/blog/new-in-entity-framework-7-bulk-operations-with-executedelete-and-executeupdate