Entity Framework Core 7批量数据插入实现高速化
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
public static class DbContextExtensions
{
public static async Task BulkInsertAsync<TEntity>(this DbContext context, IEnumerable<TEntity> entities, int batchSize = 1000)
where TEntity : class
{
// 将实体分批插入数据库
foreach (var batch in entities.Split(batchSize))
{
context.AddRange(batch);
await context.SaveChangesAsync();
}
}
private static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int size)
{
T[] bucket = null;
var count = 0;
foreach (var item in source)
{
if (bucket == null)
{
bucket = new T[size];
}
bucket[count++] = item;
if (count >= size)
{
yield return bucket.Take(size);
bucket = null;
count = 0;
}
}
if (bucket != null && count > 0)
{
yield return bucket.Take(count);
}
}
}
这个代码示例展示了如何为DbContext定义一个扩展方法,以批量插入数据。它使用了一个辅助方法Split
来将大的实体集合分割成小批量,并且为每个批量执行AddRange
和SaveChanges
操作。这样做可以减少内存占用并且对数据库的压力,特别适合处理大量数据的插入场景。
评论已关闭