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