久しぶりにEFCoreを触ってみたら 一括更新・一括削除( ExecuteUpdate / ExecuteDelete ) という良さげな機能が追加されていたので試してみました。 今までは一度SELECTした後にUPDATEなりDELETEしていたのがSELECTしなくても良くなりました。
実行環境
- Visual Studio 2022 17.5.3
- .NET 7
モデルの準備
次のようなTodoをモデルとします。
internal record Todo { publicint Id { get; set; } publicstring? Content { get; set; } public DateTime DateTime { get; set; } }
更新に先んじて初期データを投入しておきます。
var dbContext =new AppDbContext(); var todos =new List<Todo> { new Todo { Id =1, Content ="シャケ", DateTime = DateTime.Today }, new Todo { Id =2, Content ="ガチホコ", DateTime = DateTime.Today }, new Todo { Id =3, Content ="ガチヤグラ", DateTime = DateTime.Today }, }; await dbContext.Todos.AddRangeAsync(todos); await dbContext.SaveChangesAsync();
一括更新
ExecuteUpdateというメソッドを使います。SetPropertyで更新するプロパティ(カラム)を指定します。 すべてのTodoの日付を更新してみます。
var dbContext =new AppDbContext(); dbContext.Todos.ExecuteUpdateAsync(s => s.SetProperty(b => b.DateTime, b => b.DateTime.AddDays(1)));
すべてのTodoの日付が更新されました。
一括削除
ExecuteDeleteというメソッドを使います。 ガチ~から始まる内容のTodoを削除してみます。
var dbContext =new AppDbContext(); await dbContext.Todos.Where(todo => todo.Content.Contains("ガチ")).ExecuteDeleteAsync();