當前位置: 妍妍網 > 碼農

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 方法可以_提高效能。