需要安装 nuget 包 DapperExtensions
代码:
public static void InsertBatchTest<T>(IDbConnection conn, IEnumerable<T> entityList, IDbTransaction transaction = null) where T : class
{
var tbName = string.Format("dbo.{0}", typeof(T).Name);
var trans = (SqlTransaction)transaction;
using (var bulkCopy = new SqlBulkCopy(conn as SqlConnection, SqlBulkCopyOptions.TableLock, trans))
{
bulkCopy.BatchSize = 10000;
bulkCopy.BulkCopyTimeout = 60;
bulkCopy.DestinationTableName = tbName;
var table = new DataTable();
DapperExtensions.Sql.ISqlGenerator sqlGenerator = new SqlGeneratorImpl(new DapperExtensionsConfiguration());
var classMap = sqlGenerator.Configuration.GetMap<T>();
var props = classMap.Properties.Where(x => x.Ignored == false).ToArray();
foreach (var propertyInfo in props)
{
bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyInfo.PropertyType) ?? propertyInfo.PropertyInfo.PropertyType);
}
var values = new object[props.Count()];
foreach (var itemm in entityList)
{
for (var i = 0; i < values.Length; i++)
{
values[i] = props[i].PropertyInfo.GetValue(itemm, null);
}
table.Rows.Add(values);
}
bulkCopy.WriteToServer(table);
}
}
2023/09/26 更新
public static Task InsertBatchTest<T>(this IDbConnection conn, IEnumerable<T> entityList, IDbTransaction transaction = null) where T : class
{
if (!entityList.Any()) return Task.CompletedTask;
var tbName = string.Format("dbo.{0}", typeof(T).Name);
var trans = (SqlTransaction)transaction;
using (var bulkCopy = new SqlBulkCopy(conn as SqlConnection, SqlBulkCopyOptions.TableLock, trans))
{
bulkCopy.BatchSize = 10000;
bulkCopy.BulkCopyTimeout = 60;
bulkCopy.DestinationTableName = tbName;
var table = new DataTable();
DapperExtensions.Sql.ISqlGenerator sqlGenerator = new SqlGeneratorImpl(new DapperExtensionsConfiguration());
var classMap = sqlGenerator.Configuration.GetMap<T>();
var memberMaps = classMap.Properties.Where(x => x.Ignored == false).ToArray();
foreach (var memberMap in memberMaps)
{
bulkCopy.ColumnMappings.Add(memberMap.Name, memberMap.Name);
table.Columns.Add(memberMap.Name, Nullable.GetUnderlyingType(memberMap.MemberType) ?? memberMap.MemberType);
}
var values = new object[memberMaps.Count()];
var type = typeof(T);
foreach (var itemm in entityList)
{
for (var i = 0; i < values.Length; i++)
{
values[i] = type.GetProperty(memberMaps[i].Name).GetValue(itemm, null);
}
table.Rows.Add(values);
}
return bulkCopy.WriteToServerAsync(table);
}
}