From a0920bebdc089e2f049935f5c9ff497db7ee5cdd Mon Sep 17 00:00:00 2001 From: sunkaixuna <610262374@qq.com> Date: Thu, 18 Nov 2021 02:39:29 +0800 Subject: [PATCH] Update db.Fastest --- .../SqlServerTest/Demo/Demo3_Insertable.cs | 7 ++- .../FastestProvider/FastestProvider.cs | 59 ++++++++++++++----- .../SugarProvider/SqlSugarProvider.cs | 2 +- .../SqlSugar/Interface/IFastBuilder.cs | 3 +- Src/Asp.Net/SqlSugar/Interface/IFastest.cs | 2 + .../SqlSugar/Interface/ISqlSugarClient.cs | 2 +- .../SqlBuilder/SqlServerFastBuilder.cs | 22 +++++++ Src/Asp.Net/SqlSugar/SqlSugarClient.cs | 2 +- Src/Asp.Net/SqlSugar/SqlSugarScope.cs | 2 +- 9 files changed, 80 insertions(+), 21 deletions(-) diff --git a/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs b/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs index 225cf8d72..d2819ea23 100644 --- a/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs +++ b/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs @@ -32,8 +32,8 @@ namespace OrmTest var insertObj = new Order() { Id = 1, Name = "order1", Price = 0 }; var insertObjs = new List { - new Order() { Id = 11, Name = "order11", Price=0 }, - new Order() { Id = 12, Name = "order12" , Price=0} + new Order() { Id = 11, Name = "XX", Price=0 }, + new Order() { Id = 12, Name = "XX2" , Price=0} }; var x=db.Insertable(insertObjs).RemoveDataCache().IgnoreColumns(it=>it.CreateTime).UseParameter().ExecuteCommand(); @@ -156,6 +156,9 @@ namespace OrmTest dict.Add("CreateTime", DateTime.Now); dict.Add("Price", 1); db.Insertable(dict).AS("[Order]").ExecuteCommand(); + + + db.Fastest().BulkUpdate(insertObjs); Console.WriteLine("#### Insertable End ####"); } diff --git a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs index 5a2637d5a..35ed12ba4 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs @@ -3,19 +3,22 @@ using System.Collections.Generic; using System.Data; using System.Text; using System.Threading.Tasks; - +using System.Linq; namespace SqlSugar { - public class FastestProvider:IFastest + public class FastestProvider:IFastest where T:class,new() { private SqlSugarProvider context; private ISugarQueryable queryable; private string AsName { 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 Api public int BulkCopy(List datas) { return BulkCopyAsync(datas).ConfigureAwait(true).GetAwaiter().GetResult(); @@ -28,11 +31,42 @@ namespace SqlSugar var result = await buider.ExecuteBulkCopyAsync(dt); return result; } + 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 async Task BulkUpdateAsync(List datas,string [] whereColumns,string [] updateColumns) + { + var isAuto = this.context.CurrentConnectionConfig.IsAutoCloseConnection; + this.context.CurrentConnectionConfig.IsAutoCloseConnection = false; + DataTable dt = ToDdateTable(datas); + IFastBuilder buider = new SqlServerFastBuilder(); + 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; + } + #endregion + + #region Setting public IFastest AS(string tableName) { this.AsName = tableName; return this; - } + } + #endregion + + #region Helper private DataTable ToDdateTable(List datas) { DataTable tempDataTable = ReflectionInoCore.GetInstance().GetOrCreate("BulkCopyAsync" + typeof(T).FullName, () => queryable.Where(it => false).ToDataTable()); @@ -41,8 +75,7 @@ namespace SqlSugar { dt.Columns.Add(item.ColumnName, item.DataType); } - var entityInfo = this.context.EntityMaintenance.GetEntityInfo(); - GetTableName(dt, entityInfo); + dt.TableName = GetTableName(); var columns = entityInfo.Columns; foreach (var item in datas) { @@ -66,29 +99,27 @@ namespace SqlSugar return dt; } - - private void GetTableName(DataTable dt, EntityInfo entityInfo) + private string GetTableName() { if (this.AsName.HasValue()) { - dt.TableName = queryable.SqlBuilder.GetTranslationTableName(AsName); + return queryable.SqlBuilder.GetTranslationTableName(AsName); } else { - dt.TableName = queryable.SqlBuilder.GetTranslationTableName(entityInfo.DbTableName); + return queryable.SqlBuilder.GetTranslationTableName(entityInfo.DbTableName); } } - private object ValueConverter(EntityColumnInfo columnInfo,object value) + private object ValueConverter(EntityColumnInfo columnInfo, object value) { if (value == null) return value; - if (value is DateTime&&(DateTime)value == DateTime.MinValue) + if (value is DateTime && (DateTime)value == DateTime.MinValue) { value = Convert.ToDateTime("1900-01-01"); } return value; - } - - + } + #endregion } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index ab458706d..7ae06df43 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -1178,7 +1178,7 @@ namespace SqlSugar #endregion #region - public IFastest Fastest() + public IFastest Fastest() where T:class,new() { return new FastestProvider(this); } diff --git a/Src/Asp.Net/SqlSugar/Interface/IFastBuilder.cs b/Src/Asp.Net/SqlSugar/Interface/IFastBuilder.cs index 6a9948411..7f97478f4 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IFastBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IFastBuilder.cs @@ -10,7 +10,8 @@ namespace SqlSugar public interface IFastBuilder { SqlSugarProvider Context { get; set; } - + Task UpdateByTempAsync(string tableName,string tempName,string [] updateColumns,string[] whereColumns); Task ExecuteBulkCopyAsync(DataTable dt); + Task CreateTempAsync(DataTable dt) where T : class, new(); } } diff --git a/Src/Asp.Net/SqlSugar/Interface/IFastest.cs b/Src/Asp.Net/SqlSugar/Interface/IFastest.cs index 9a784b72c..a6592768d 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IFastest.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IFastest.cs @@ -10,5 +10,7 @@ namespace SqlSugar IFastest AS(string tableName); int BulkCopy(List datas); Task BulkCopyAsync(List datas); + int BulkUpdate(List datas); + Task BulkUpdateAsync(List datas); } } diff --git a/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs b/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs index c0ec0a4d4..8a2e9db1e 100644 --- a/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs +++ b/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs @@ -178,7 +178,7 @@ namespace SqlSugar #endregion #region Fastest - IFastest Fastest(); + IFastest Fastest() where T : class, new(); #endregion } diff --git a/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs index 31b42ff08..f00232616 100644 --- a/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs @@ -13,6 +13,10 @@ namespace SqlSugar public SqlSugarProvider Context { get; set; } + public string UpdateSql { get; set; } = @"UPDATE TM + SET {0} + FROM {1} TM + INNER JOIN {2} TE ON {3} "; public async Task ExecuteBulkCopyAsync(DataTable dt) { @@ -55,5 +59,23 @@ namespace SqlSugar this.Context.Ado.Connection.Close(); } } + + public async Task UpdateByTempAsync(string tableName, string tempName, string[] updateColumns, string[] whereColumns) + { + Check.ArgumentNullException(!updateColumns.Any(),"update columns count is 0"); + Check.ArgumentNullException(!whereColumns.Any(), "where columns count is 0"); + var sets = string.Join(",", updateColumns.Select(it=>$"TM.{it}=TE.{it}")); + var wheres = string.Join(",", whereColumns.Select(it => $"TM.{it}=TE.{it}")); + string sql = string.Format(UpdateSql,sets, tableName,tempName, wheres); + return await this.Context.Ado.ExecuteCommandAsync(sql); + } + + public async Task CreateTempAsync(DataTable dt) where T :class,new() + { + await this.Context.UnionAll( + this.Context.Queryable().Where(it => false).AS(dt.TableName), + this.Context.Queryable().Where(it => false).AS(dt.TableName)).Select("top 1 * into #temp").ToListAsync(); + dt.TableName = "#temp"; + } } } diff --git a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs index 69e5c7d1e..388ddc447 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs @@ -566,7 +566,7 @@ namespace SqlSugar #endregion #region - public IFastest Fastest() + public IFastest Fastest() where T : class, new() { return this.Context.Fastest(); } diff --git a/Src/Asp.Net/SqlSugar/SqlSugarScope.cs b/Src/Asp.Net/SqlSugar/SqlSugarScope.cs index ffe3fd1e3..31fe68091 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugarScope.cs +++ b/Src/Asp.Net/SqlSugar/SqlSugarScope.cs @@ -641,7 +641,7 @@ namespace SqlSugar return ScopedContext.IsAnyConnection(configId); } - public IFastest Fastest() + public IFastest Fastest() where T : class, new() { return ScopedContext.Fastest(); }