批量执行命令
基于 for 循环的批量操作
以.NET6之前,我们可以使用以下方式来批量执行数据库修改操作:
using( DbContext dbContext = DbConnManager.CreateAppDb("mysqltest") ) {
foreach(var x in list){
dbContext.Entity.Insert(x);
}
}
这种方式虽然可以正确完成操作,但是性能不是最好的。
如果希望提升批量操作的性能,可以使用本文下面介绍的方法。
新的批量操作API
可参考以下示例:
public async Task<int> BatchInsert()
{
// 从前端提交的数据来构造实体对象
Order order = CreateOrderObject(/****/);
using( DbContext dbContext = DbConnManager.CreateAppDb("mysqltest") ) {
// 建议在事务中执行批量插入操作,
// 如果数据的完整性不是非常重要,也可以不启用事务,获取更好的性能
dbContext.BeginTransaction();
// 先插入主表记录
int newOrderId = dbContext.Entity.Insert(order, InsertOption.GetNewId);
// 将 新ID 赋值给各子表实体
order.Details.ForEach(x=>x.OrderID = newOrderId);
// ############# 批量插入 子表记录 #############
await dbContext.Batch.InsertAsync(order.Details);
dbContext.Commit();
return newOrderId;
}
}
小结: 所有的批量操作API可以通过以下方式访问
dbContext.Batch.XXXXX()
目前支持的API:
/// <summary>
/// 将实体列表以批量形式 插入 到数据表中
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="list">实体列表</param>
public int Insert<T>(List<T> list) where T : Entity, new()
/// <summary>
/// 将实体列表以批量形式 插入 到数据表中
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="list">实体列表</param>
public async Task<int> InsertAsync<T>(List<T> list) where T : Entity, new()
/// <summary>
/// 将实体列表以批量形式 更新 到数据表中
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="list">实体列表</param>
public int Update<T>(List<T> list) where T : Entity, new()
/// <summary>
/// 将实体列表以批量形式 更新 到数据表中
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="list">实体列表</param>
public async Task<int> UpdateAsync<T>(List<T> list) where T : Entity, new()
/// <summary>
/// 批量执行一些CRD操作
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public int Execute(List<BaseCommand> list)
/// <summary>
/// 批量执行一些CRD操作
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public async Task<int> ExecuteAsync(List<BaseCommand> list)