我有一个包含大约1,000,000条记录的列表。而且,我正在使用EF将其插入数据库。由于需要花费太长时间,因此我需要将此列表拆分为100个记录的块并保存。
我该怎么做?
await dbCont.People.AddAsync(peoples);
await dbCont.Savechanges();
这里的人民列表包含1,000,000条记录。而不是一次保存所有内容(使插入速度变慢),我需要一次插入大约100条记录。我该怎么办?
答案 0 :(得分:0)
您可以这样做:
var batchSize = 100;
var processed = 0;
var hasNextBatch = true;
while(hasNextBatch)
{
var batch = peoples.Skip(processed).Take(batch).ToList();
await dbCont.People.AddAsync(batch);
await dbCont.Savechanges();
processed += batch.count;
hasNextBatch = batch.Count == batchSize;
}
但是您必须考虑到,当批次插入失败时,先前的批次已经提交。
答案 1 :(得分:0)
您可以使用库Batch的扩展方法MoreLinq:将源序列分成大小合适的存储桶。
var list = new List<int>(Enumerable.Range(1, 25));
var buckets = list.Batch(size: 10);
foreach (var bucket in buckets)
{
Console.WriteLine(String.Join(", ", bucket));
}
输出
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
11, 12, 13, 14, 15, 16, 17, 18, 19, 20
21, 22, 23, 24, 25
答案 2 :(得分:0)
我过去曾尝试在EF中插入块,但是由于实体跟踪,它很慢。 当然,您可以禁用实体跟踪,但是最好使用SqlBulkCopy批量插入。这是一篇不错的文章Bulk inserting data into SQL Server。