批量执行命令

基于 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)