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

0721c81a8e031732b6e40b5aa6a8e0d4.jpeg

概述:有时,在某些情况下,在使用_实体框架_时,我们必须_更新_或_删除_许多_记录_。通常,在进行修改之前,我们必须先从_数据库_中_检索将要更新_或_删除_的所有_记录_。这会导致_数据库的多次往返_,这当然会影响应用程序性能。幸运的是,在 .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 方法可以_提高性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值