public static async Task <int> BatchUpdateAsync <T>(this IQueryable <T> query, T updateValues, List <string> updateColumns = null, CancellationToken cancellationToken = default) where T : class, new()
        {
            DbContext context = BatchUtil.GetDbContext(query);

            var(sql, sqlParameters) = BatchUtil.GetSqlUpdate(query, context, updateValues, updateColumns);
            return(await BatchUtil.ExecuteSqlAsync(context, sql, sqlParameters, cancellationToken).ConfigureAwait(false));
        }
        public static async Task <int> BatchUpdateAsync <T>(this IQueryable <T> query, Expression <Func <T, T> > updateExpression, CancellationToken cancellationToken = default) where T : class
        {
            var context = BatchUtil.GetDbContext(query);

            var(sql, sqlParameters) = BatchUtil.GetSqlUpdate(query, context, updateExpression);
            return(await BatchUtil.ExecuteSqlAsync(context, sql, sqlParameters, cancellationToken).ConfigureAwait(false));
        }
        // Async methods

        public static async Task <int> BatchDeleteAsync <T>(this IQueryable <T> query, CancellationToken cancellationToken = default) where T : class
        {
            DbContext context = BatchUtil.GetDbContext(query);

            (string sql, var sqlParameters) = BatchUtil.GetSqlDelete(query, context);
            return(await BatchUtil.ExecuteSqlAsync(context, sql, sqlParameters, cancellationToken).ConfigureAwait(false));
        }