当前位置: 欣欣网 > 码农

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

2024-05-15码农

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