将列表拆分为大块-C#

时间:2019-04-23 10:08:24

标签: c# entity-framework

我有一个包含大约1,000,000条记录的列表。而且,我正在使用EF将其插入数据库。由于需要花费太长时间,因此我需要将此列表拆分为100个记录的块并保存。

我该怎么做?

        await dbCont.People.AddAsync(peoples);
        await dbCont.Savechanges();

这里的人民列表包含1,000,000条记录。而不是一次保存所有内容(使插入速度变慢),我需要一次插入大约100条记录。我该怎么办?

3 个答案:

答案 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