ひでぼ~blog

C#ときどきゲーム

EFCore 7.0の一括更新・一括削除を試す

久しぶりにEFCoreを触ってみたら 一括更新・一括削除( ExecuteUpdate / ExecuteDelete ) という良さげな機能が追加されていたので試してみました。 今までは一度SELECTした後にUPDATEなりDELETEしていたのがSELECTしなくても良くなりました。

実行環境

モデルの準備

次のようなTodoをモデルとします。

internal record Todo
{
    public int Id { get; set; }

    public string? 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();

ガチホコガチヤグラのTodoが削除されました。

参考

learn.microsoft.com