Reputation:
Is there way with EF Core Bulk extensions to only update first few 10000 rows? write message, update next batch, write message in loop until complete?
I know there is Batch Size, however if there is only 5 million to update, and I want only update a certain amount, write a message, in continual loop until complete, how can this be done?
Should I use Top or Take?
I want to write "Hello", every few batches.
while {
await _dbContext.Set<Product>()
.Where(x => x.Manufacturer == "ABC Company" &&
x.StartYear == 2019 &&
x.ProductType.ProductTypeDescription == "Electronics")
.BatchUpdateAsync(x => new Product(){
Manufacturer = "XYZ Company",
StartYear = 2020 });
Console.WriteLine("hello"):
https://github.com/borisdj/EFCore.BulkExtensions
Using EF Core 3.1.
Company does not want to use SignalR
Upvotes: 1
Views: 1128
Reputation: 1741
Try this.
int iEnd = 5;
for (var i = 0; i <= iEnd; i++)
{
var products = await _dbContext.Set<Product>().Where(x => x.Manufacturer == "ABC Company" &&
x.StartYear == 2019 &&
x.ProductType.ProductTypeDescription == "Electronics").Skip(i * 10000).Take(10000).ToList();
products.ForEach(x =>
{
x.Manufacturer = "XYZ Company";
x.StartYear = 2020;
});
_dbContext.Set<Product>().UpdateRange(products); // or you can use BulkUpdate here.
}
_dbContext.SaveChanges();
int i = 0;
Boolean IsContinue = true;
while (IsContinue)
{
var products = await _dbContext.Set<Product>().Where(x => x.Manufacturer == "ABC Company" &&
x.StartYear == 2019 &&
x.ProductType.ProductTypeDescription == "Electronics").Skip(i * 10000).Take(10000).ToList();
if (products.Count() == 0)
IsContinue = false;
else
{
products.ForEach(x =>
{
x.Manufacturer = "XYZ Company";
x.StartYear = 2020;
});
_dbContext.Set<Product>().UpdateRange(products); // or you can use BulkUpdate here.
}
i++;
}
_dbContext.SaveChanges();
Upvotes: 1
Reputation: 89166
It looks like BatchSize is only used for bulk insert. For update the expression is translated to a single SQL UPDATE statement, which doesn't operate by "batches".
Upvotes: 0