C#中通过 Entity Framework Core更新和删除多条记录方法

作者:微信公众号:【架构师老卢】
4-30 9:56
19

概述:有时,在某些情况下,在使用_实体框架_时,我们必须_更新_或_删除_许多_记录_。通常,在进行修改之前,我们必须先从_数据库_中_检索将要更新_或_删除_的所有_记录_。这会导致_数据库的多次往返_,这当然会影响应用程序性能。幸运的是,在 .NET 8 中,我们可以_更新_和_删除_许多_记录_,而无需先从_数据库_中检索所有这些_记录_。这可以使用 Entity Framework Core 提供的 _和 扩展方法_完成。ExecuteUpdateExecuteDelete执行更新我们可以使用 _or 方法_直接_更新数据库_中与 LINQ 查询_条件匹配的每个_实体_的多_行。Execut

有时,在某些情况下,在使用_实体框架_时,我们必须_更新_或_删除_许多_记录_。

通常,在进行修改之前,我们必须先从_数据库_中_检索将要更新_或_删除_的所有_记录_。这会导致_数据库的多次往返_,这当然会影响应用程序性能。

幸运的是,在 .NET 8 中,我们可以_更新_和_删除_许多_记录_,而无需先从_数据库_中检索所有这些_记录_。这可以使用 Entity Framework Core 提供的 _和 扩展方法_完成。ExecuteUpdateExecuteDelete

执行更新

我们可以使用 _or 方法_直接_更新数据库_中与 LINQ 查询_条件匹配的每个_实体_的多_行。ExecuteUpdateExecuteUpdateAsync

context.Products  
    .Where(x => x.Category == "Coffee" && x.Price < 10)  
    .ExecuteUpdate(x => x.SetProperty(p => p.Category, "Cheap Coffee"));

_以上代码_将转换为SQL,如下所示:

UPDATE Products  
SET Category = 'Cheap Coffee'  
WHERE Category = 'Coffee' AND Price < 10

我们可以通过_链接方法_一次_更新_几列:SetProperty

context.Products  
    .Where(x => x.Category == "Coffee" && x.Price < 10)  
    .ExecuteUpdate(x => x.SetProperty(p => p.Category, "Cheap Coffee")  
    .SetProperty(p => p.Price, 10));

_上面的代码_将被翻译成以下 SQL:

UPDATE Products  
SET Category = 'Cheap Coffee', Price = 10  
WHERE Category = 'Coffee' AND Price < 10

还有一个异_步_版本,即:ExecuteUpdateExecuteUpdateAsync

await context.Products  
    .Where(x => x.Category == "Coffee" && x.Price < 10)  
    .ExecuteUpdateAsync(x => x.SetProperty(p => p.Category, "Cheap Coffee"),   
    cancellationToken);

执行删除

我们可以使用 _or 方法_删除_数据库_中与 LINQ 查询_中的条件匹配的所有_行。ExecuteDeleteExecuteDeleteAsync

context.Product  
    .Where(x => x.Category == "Coffee" && Price == 0)  
    .ExecuteDelete();

_代码_将转换为 SQL,如下所示:

DELETE FROM Products  
WHERE Category = 'Coffee' AND Price = 0

我们还可以使用_异步_版本:

await context.Product  
    .Where(x => x.Category == "Coffee" && Price == 0)  
    .ExecuteDeleteAsync(cancellationToken);

数据库事务

and 方法_将直接执行到_数据库中,无需调用_该方法_ 。ExecuteUpdateExecuteDeleteSaveChanges

如果有多个_数据库命令_,并且我们想将它们_包装_成一个_事务_,我们需要手动创建_数据库事务_:

// create new transaction  
using var transaction = await context.Database.BeginTransactionAsync(cancellationToken);  
  
try  
{  
    // insert new data using standard approach  
    var newProduct = Product  
    {  
        Name = "Caramel Java Chip",  
        Category = "Coffee"  
        Price = 50  
    };  
    context.Add(newProduct);  
    context.SaveChangesAsync(cancellationToken);  
  
    // update using ExecuteUpdate  
    await context.Products  
        .Where(x => x.Category == "Coffee" && x.Price < 10)  
        .ExecuteUpdateAsync(x => x.SetProperty(p => p.Category, "Cheap Coffee"),   
        cancellationToken);  
  
    // delete using ExecuteDelete  
    await context.Product.Where(x => x.Category == "Coffee" && Price == 0)  
        .ExecuteDeleteAsync(cancellationToken);  
  
    // commit transaction  
    await transaction.CommitAsync(cancellationToken);  
}  
catch (Exception)  
{  
    // rollback if error  
    await transaction.RollbackAsync(cancellationToken);  
    throw;  
}

对于涉及大量数据的操作,使用 _OR 方法可以_提高性能。

相关留言评论
昵称:
邮箱:
阅读排行