/// <summary>
/// 批量插入助手
/// </summary>
public static class BulkHelper
{
/// <summary>
/// 批量导入入口
/// </summary>
/// <param name="con">DbConnection 数据库连接资源</param>
/// <param name="models">实体列表</param>
/// <param name="tableName">表名</param>
/// <typeparam name="T">实体泛型</typeparam>
public static void BulkCopy<T>(DbConnection con, List<T> models, string tableName = null)
{
BulkInsert(con, models, tableName);
}
/// <summary>
/// IList 的扩展方法 用于集合转换 DataTable 类
/// </summary>
/// <param name="models">实体列表</param>
/// <param name="tableName">表名</param>
/// <typeparam name="T">实体泛型</typeparam>
/// <returns>DataTable</returns>
private static DataTable ToSqlBulkCopyDataTable<T>(this List<T> models, string tableName = null)
{
var props = TypeDescriptor.GetProperties(typeof(T));
var table = new DataTable
{
TableName = tableName?.ToLowerInvariant() ?? typeof(T).Name.ToLowerInvariant()
};
// 表中 字段(列)的填充
foreach (PropertyDescriptor prop in props)
{
var type = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
if (type.IsEnum) type = typeof(int);
table.Columns.Add(prop.Name.ToLowerInvariant(), type);
}
// 表中 数据内容的填充
foreach (var data in models)
{
var newRow = table.NewRow();
foreach (PropertyDescriptor prop in props)
{
newRow[prop.Name.ToLowerInvariant()] = prop.GetValue(data) ?? DBNull.Value;
}
table.Rows.Add(newRow);
}
return table;
}
/// <summary>
/// 批量导入或修改
/// </summary>
/// <param name="con">DbConnection 数据库资源</param>
/// <param name="datas">实体列表</param>
/// <param name="tableName">表名</param>
/// <typeparam name="T">实体泛型</typeparam>
private static void BulkInsert<T>(DbConnection con, List<T> datas, string tableName)
{
// 数据模型列表转换 DataTable
var tb = datas.ToSqlBulkCopyDataTable(tableName);
var ops = new BulkOperation(con);
// 批量插入 引用 Z.BulkOperations
ops.BulkInsert(tb);
}
}
不知性能上和 EF Core 比会不会好一些 gist 地址-> https://gist.github.com/KomiSans/9824c2352f5efdee68bc70bd6917616a
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.