using System; using System.Collections.Generic; using System.Data; using System.Text; using System.Threading.Tasks; using System.Linq; namespace SqlSugar { public partial class FastestProvider:IFastest where T:class,new() { private SqlSugarProvider context; private ISugarQueryable queryable; private string AsName { get; set; } private int Size { get; set; } private EntityInfo entityInfo { get; set; } public FastestProvider(SqlSugarProvider sqlSugarProvider) { this.context = sqlSugarProvider; this.queryable = this.context.Queryable(); entityInfo=this.context.EntityMaintenance.GetEntityInfo(); } #region BulkCopy public int BulkCopy(List datas) { return BulkCopyAsync(datas).ConfigureAwait(true).GetAwaiter().GetResult(); } public async Task BulkCopyAsync(List datas) { if (Size > 0) { int resul=0; await this.context.Utilities.PageEachAsync(datas, Size, async item => { resul+= await _BulkCopy(item); }); return resul; } else { return await _BulkCopy(datas); } } #endregion #region BulkUpdate public int BulkUpdate(List datas) { return BulkUpdateAsync(datas).ConfigureAwait(true).GetAwaiter().GetResult(); } public async Task BulkUpdateAsync(List datas) { var whereColumns=entityInfo.Columns.Where(it => it.IsPrimarykey).Select(it=>it.DbColumnName??it.PropertyName).ToArray(); var updateColumns = entityInfo.Columns.Where(it => !it.IsPrimarykey&&!it.IsIdentity&&!it.IsOnlyIgnoreUpdate&&!it.IsIgnore).Select(it => it.DbColumnName ?? it.PropertyName).ToArray(); return await BulkUpdateAsync(datas,whereColumns,updateColumns); } public int BulkUpdate(List datas, string[] whereColumns, string[] updateColumns) { return BulkUpdateAsync(datas,whereColumns,updateColumns).ConfigureAwait(true).GetAwaiter().GetResult(); } public async Task BulkUpdateAsync(List datas,string [] whereColumns,string [] updateColumns) { if (Size > 0) { int resul = 0; await this.context.Utilities.PageEachAsync(datas, Size, async item => { resul += await _BulkUpdate(item, whereColumns, updateColumns); }); return resul; } else { return await _BulkUpdate(datas, whereColumns, updateColumns); } } #endregion #region Core private async Task _BulkUpdate(List datas, string[] whereColumns, string[] updateColumns) { var isAuto = this.context.CurrentConnectionConfig.IsAutoCloseConnection; this.context.CurrentConnectionConfig.IsAutoCloseConnection = false; DataTable dt = ToDdateTable(datas); IFastBuilder buider = GetBuider(); buider.Context = context; await buider.CreateTempAsync(dt); await buider.ExecuteBulkCopyAsync(dt); //var queryTemp = this.context.Queryable().AS(dt.TableName).ToList();//test var result = await buider.UpdateByTempAsync(GetTableName(), dt.TableName, updateColumns, whereColumns); this.context.DbMaintenance.DropTable(dt.TableName); this.context.CurrentConnectionConfig.IsAutoCloseConnection = isAuto; return result; } private async Task _BulkCopy(List datas) { DataTable dt = ToDdateTable(datas); IFastBuilder buider = new SqlServerFastBuilder(); buider.Context = context; var result = await buider.ExecuteBulkCopyAsync(dt); return result; } #endregion } }