有没有办法使用EF核心批量扩展来只更新前几行10000行?写入消息,更新下一批,循环写入消息直到完成?
我知道有批处理的大小,但是如果只有500万要更新,并且我只想更新一定的量,写一条消息,在连续循环中直到完成,怎么做呢?
我应该使用Top还是Take?
我想写"Hello",每隔几个批次。
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
使用EF Core 3.1。
公司不想使用SignalR
发布于 2020-08-21 07:52:33
看起来BatchSize只用于批量插入。For update表达式被转换为单个SQL UPDATE语句,该语句不按“批处理”操作。
发布于 2020-08-21 08:58:04
尝尝这个。
if循环到前几个10,000
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();If循环到500万。
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();https://stackoverflow.com/questions/63514362
复制相似问题