我有一个这样的缺失项列表,我试图通过从现有列表中取出一小部分项(一次2500个项)来对我的数据库表执行批量操作:
var castedItems = missingItems.ToList();
while (castedItems.Any())
{
var subList = castedItems.Take(2500).ToList();
DBRetry.Do(() => EFBatchOperation.For(ctx,
ctx.SearchedUserItems).InsertAll(subList), TimeSpan.FromSeconds(2));
castedItems.RemoveRange(subList);
}
缺少的项目是并发袋,而铸造的项目是列表。现在,我应该创建一个扩展方法,该方法将接受我取出的列表,并删除快速插入数据库中的那2500个项目...但是我不太确定该怎么做...
有人可以帮我吗?
P.S。有问题的部分是这个:
castedItems.RemoveRange(subList);
它表示removerange仅接受两个整数作为参数(from和to):/
答案 0 :(得分:0)
var castedItems = missingItems.ToList();
var offset = 0;
var limit = 0;
while (castedItems.Any())
{
var subList = castedItems.Take(2500).ToList();
limit = limit + 2500;
DBRetry.Do(() => EFBatchOperation.For(ctx,
ctx.SearchedUserItems).InsertAll(subList), TimeSpan.FromSeconds(2));
castedItems.RemoveRange(offset, limit);
offset = offset + limit?
}
尝试此操作,可能需要更新偏移量限制更新。没有检查工作情况
答案 1 :(得分:0)
我相信您可以做到:
castedItems.RemoveRange(0,2500);
答案 2 :(得分:0)
假设您有一个好的同伴,可以做。
castedItems = castedItems.Except(subList);
请参阅https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.except?view=netframework-4.7.2
那是一般情况。您可以使用跳过:
var castedItems = castedItems.Skip(2500);
跳过是止步的“反向”。
在这种情况下,跳过操作也比RemoveRange或RemoveRange快得多。由于两个原因,不需要分配,并且它可以很懒。