diff --git a/Src/Asp.Net/SqlServerTest/Demos/H_Queue.cs b/Src/Asp.Net/SqlServerTest/Demos/H_Queue.cs new file mode 100644 index 000000000..b9957cc5c --- /dev/null +++ b/Src/Asp.Net/SqlServerTest/Demos/H_Queue.cs @@ -0,0 +1,65 @@ +using OrmTest.Demo; +using OrmTest.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OrmTest.Demo +{ + public class Queue : DemoBase + { + public static void Init() + { + var db = GetInstance(); + db.Insertable(new Student() { Name = "a" }).AddQueue(); + db.Insertable(new Student() { Name = "b" }).AddQueue(); + db.SaveQueues(); + + db.Insertable(new Student() { Name = "a" }).AddQueue(); + db.Insertable(new Student() { Name = "b" }).AddQueue(); + db.Insertable(new Student() { Name = "c" }).AddQueue(); + db.Insertable(new Student() { Name = "d" }).AddQueue(); + var ar = db.SaveQueuesAsync(); + ar.Wait(); + + + db.Queryable().AddQueue(); + db.Queryable().AddQueue(); + var result = db.SaveQueues(); + + db.Queryable().AddQueue(); + db.Queryable().AddQueue(); + db.AddQueue("select @id", new { id = 1 }); + var result2 = db.SaveQueues(); + + + + db.AddQueue("select 1"); + db.AddQueue("select 2"); + db.AddQueue("select 3"); + db.AddQueue("select 4"); + db.AddQueue("select 5"); + db.AddQueue("select 6"); + db.AddQueue("select 7"); + + var result3 = db.SaveQueues(); + + + db.AddQueue("select 1"); + var result4 = db.SaveQueues(); + + + db.AddQueue("select 1"); + db.AddQueue("select 2"); + var result5 = db.SaveQueues(); + + + db.AddQueue("select 1"); + db.AddQueue("select 2"); + db.AddQueue("select 3"); + var result6 = db.SaveQueuesAsync(); + result6.Wait(); + } + } +} diff --git a/Src/Asp.Net/SqlServerTest/Program.cs b/Src/Asp.Net/SqlServerTest/Program.cs index f50294096..63e7eea43 100644 --- a/Src/Asp.Net/SqlServerTest/Program.cs +++ b/Src/Asp.Net/SqlServerTest/Program.cs @@ -53,6 +53,7 @@ namespace OrmTest Demo.Delete.Init(); Demo.InsertOrUpdate.Init(); Demo.Debugger.Init(); + Demo.Queue.Init(); Console.WriteLine("all successfully."); Console.ReadKey(); diff --git a/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj b/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj index b30d5d9ae..5afa6983a 100644 --- a/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj +++ b/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj @@ -58,6 +58,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/Abstract/AdoProvider/AdoProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/AdoProvider/AdoProvider.cs index 145b69703..4d4600dc5 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/AdoProvider/AdoProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/AdoProvider/AdoProvider.cs @@ -343,6 +343,35 @@ namespace SqlSugar throw ex; } } + public virtual IDataReader GetDataReaderNoClose(string sql, params SugarParameter[] parameters) + { + try + { + InitParameters(ref sql, parameters); + if (FormatSql != null) + sql = FormatSql(sql); + SetConnectionStart(sql); + var isSp = this.CommandType == CommandType.StoredProcedure; + if (this.ProcessingEventStartingSQL != null) + ExecuteProcessingSQL(ref sql, parameters); + ExecuteBefore(sql, parameters); + IDbCommand sqlCommand = GetCommand(sql, parameters); + IDataReader sqlDataReader = sqlCommand.ExecuteReader(); + if (isSp) + DataReaderParameters = sqlCommand.Parameters; + if (this.IsClearParameters) + sqlCommand.Parameters.Clear(); + ExecuteAfter(sql, parameters); + SetConnectionEnd(sql); + return sqlDataReader; + } + catch (Exception ex) + { + if (ErrorEvent != null) + ExecuteErrorEvent(sql, parameters, ex); + throw ex; + } + } public virtual DataSet GetDataSetAll(string sql, params SugarParameter[] parameters) { try @@ -547,6 +576,226 @@ namespace SqlSugar return SqlQuery(sql); } } + public Tuple, List> SqlQuery(string sql, object parameters = null) + { + var parsmeterArray = this.GetParameters(parameters); + this.Context.InitMppingInfo(); + var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); + builder.SqlQueryBuilder.sql.Append(sql); + if (parsmeterArray != null && parsmeterArray.Any()) + builder.SqlQueryBuilder.Parameters.AddRange(parsmeterArray); + using (var dataReader = this.GetDataReaderNoClose(builder.SqlQueryBuilder.ToSqlString(), builder.SqlQueryBuilder.Parameters.ToArray())) + { + List result = this.DbBind.DataReaderToListNoUsing(typeof(T), dataReader); + NextResult(dataReader); + List result2 = this.DbBind.DataReaderToListNoUsing(typeof(T2), dataReader); + builder.SqlQueryBuilder.Clear(); + if (this.Context.Ado.DataReaderParameters != null) + { + foreach (IDataParameter item in this.Context.Ado.DataReaderParameters) + { + var parameter = parsmeterArray.FirstOrDefault(it => item.ParameterName.Substring(1) == it.ParameterName.Substring(1)); + if (parameter != null) + { + parameter.Value = item.Value; + } + } + this.Context.Ado.DataReaderParameters = null; + } + return Tuple.Create, List>(result, result2); + } + } + + public Tuple, List, List> SqlQuery(string sql, object parameters = null) + { + var parsmeterArray = this.GetParameters(parameters); + this.Context.InitMppingInfo(); + var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); + builder.SqlQueryBuilder.sql.Append(sql); + if (parsmeterArray != null && parsmeterArray.Any()) + builder.SqlQueryBuilder.Parameters.AddRange(parsmeterArray); + using (var dataReader = this.GetDataReaderNoClose(builder.SqlQueryBuilder.ToSqlString(), builder.SqlQueryBuilder.Parameters.ToArray())) + { + List result = this.DbBind.DataReaderToListNoUsing(typeof(T), dataReader); + NextResult(dataReader); + List result2 = this.DbBind.DataReaderToListNoUsing(typeof(T2), dataReader); + NextResult(dataReader); + List result3 = this.DbBind.DataReaderToListNoUsing(typeof(T3), dataReader); + builder.SqlQueryBuilder.Clear(); + if (this.Context.Ado.DataReaderParameters != null) + { + foreach (IDataParameter item in this.Context.Ado.DataReaderParameters) + { + var parameter = parsmeterArray.FirstOrDefault(it => item.ParameterName.Substring(1) == it.ParameterName.Substring(1)); + if (parameter != null) + { + parameter.Value = item.Value; + } + } + this.Context.Ado.DataReaderParameters = null; + } + return Tuple.Create, List, List>(result, result2, result3); + } + } + + public Tuple, List, List, List> SqlQuery(string sql, object parameters = null) + { + var parsmeterArray = this.GetParameters(parameters); + this.Context.InitMppingInfo(); + var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); + builder.SqlQueryBuilder.sql.Append(sql); + if (parsmeterArray != null && parsmeterArray.Any()) + builder.SqlQueryBuilder.Parameters.AddRange(parsmeterArray); + using (var dataReader = this.GetDataReaderNoClose(builder.SqlQueryBuilder.ToSqlString(), builder.SqlQueryBuilder.Parameters.ToArray())) + { + List result = this.DbBind.DataReaderToListNoUsing(typeof(T), dataReader); + NextResult(dataReader); + List result2 = this.DbBind.DataReaderToListNoUsing(typeof(T2), dataReader); + NextResult(dataReader); + List result3 = this.DbBind.DataReaderToListNoUsing(typeof(T3), dataReader); + NextResult(dataReader); + List result4 = this.DbBind.DataReaderToListNoUsing(typeof(T4), dataReader); + builder.SqlQueryBuilder.Clear(); + if (this.Context.Ado.DataReaderParameters != null) + { + foreach (IDataParameter item in this.Context.Ado.DataReaderParameters) + { + var parameter = parsmeterArray.FirstOrDefault(it => item.ParameterName.Substring(1) == it.ParameterName.Substring(1)); + if (parameter != null) + { + parameter.Value = item.Value; + } + } + this.Context.Ado.DataReaderParameters = null; + } + return Tuple.Create, List, List, List>(result, result2, result3, result4); + } + } + public Tuple, List, List, List, List> SqlQuery(string sql, object parameters = null) + { + var parsmeterArray = this.GetParameters(parameters); + this.Context.InitMppingInfo(); + var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); + builder.SqlQueryBuilder.sql.Append(sql); + if (parsmeterArray != null && parsmeterArray.Any()) + builder.SqlQueryBuilder.Parameters.AddRange(parsmeterArray); + using (var dataReader = this.GetDataReaderNoClose(builder.SqlQueryBuilder.ToSqlString(), builder.SqlQueryBuilder.Parameters.ToArray())) + { + List result = this.DbBind.DataReaderToListNoUsing(typeof(T), dataReader); + NextResult(dataReader); + List result2 = this.DbBind.DataReaderToListNoUsing(typeof(T2), dataReader); + NextResult(dataReader); + List result3 = this.DbBind.DataReaderToListNoUsing(typeof(T3), dataReader); + NextResult(dataReader); + List result4 = this.DbBind.DataReaderToListNoUsing(typeof(T4), dataReader); + NextResult(dataReader); + List result5 = this.DbBind.DataReaderToListNoUsing(typeof(T5), dataReader); + builder.SqlQueryBuilder.Clear(); + if (this.Context.Ado.DataReaderParameters != null) + { + foreach (IDataParameter item in this.Context.Ado.DataReaderParameters) + { + var parameter = parsmeterArray.FirstOrDefault(it => item.ParameterName.Substring(1) == it.ParameterName.Substring(1)); + if (parameter != null) + { + parameter.Value = item.Value; + } + } + this.Context.Ado.DataReaderParameters = null; + } + return Tuple.Create, List, List, List, List>(result, result2, result3, result4, result5); + } + } + + public Tuple, List, List, List, List, List> SqlQuery(string sql, object parameters = null) + { + var parsmeterArray = this.GetParameters(parameters); + this.Context.InitMppingInfo(); + var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); + builder.SqlQueryBuilder.sql.Append(sql); + if (parsmeterArray != null && parsmeterArray.Any()) + builder.SqlQueryBuilder.Parameters.AddRange(parsmeterArray); + using (var dataReader = this.GetDataReaderNoClose(builder.SqlQueryBuilder.ToSqlString(), builder.SqlQueryBuilder.Parameters.ToArray())) + { + List result = this.DbBind.DataReaderToListNoUsing(typeof(T), dataReader); + NextResult(dataReader); + List result2 = this.DbBind.DataReaderToListNoUsing(typeof(T2), dataReader); + NextResult(dataReader); + List result3 = this.DbBind.DataReaderToListNoUsing(typeof(T3), dataReader); + NextResult(dataReader); + List result4 = this.DbBind.DataReaderToListNoUsing(typeof(T4), dataReader); + NextResult(dataReader); + List result5 = this.DbBind.DataReaderToListNoUsing(typeof(T5), dataReader); + NextResult(dataReader); + List result6 = this.DbBind.DataReaderToListNoUsing(typeof(T6), dataReader); + builder.SqlQueryBuilder.Clear(); + if (this.Context.Ado.DataReaderParameters != null) + { + foreach (IDataParameter item in this.Context.Ado.DataReaderParameters) + { + var parameter = parsmeterArray.FirstOrDefault(it => item.ParameterName.Substring(1) == it.ParameterName.Substring(1)); + if (parameter != null) + { + parameter.Value = item.Value; + } + } + this.Context.Ado.DataReaderParameters = null; + } + return Tuple.Create, List, List, List, List, List>(result, result2, result3, result4, result5, result6); + } + } + + public Tuple, List, List, List, List, List, List> SqlQuery(string sql, object parameters = null) + { + var parsmeterArray = this.GetParameters(parameters); + this.Context.InitMppingInfo(); + var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); + builder.SqlQueryBuilder.sql.Append(sql); + if (parsmeterArray != null && parsmeterArray.Any()) + builder.SqlQueryBuilder.Parameters.AddRange(parsmeterArray); + using (var dataReader = this.GetDataReaderNoClose(builder.SqlQueryBuilder.ToSqlString(), builder.SqlQueryBuilder.Parameters.ToArray())) + { + List result = this.DbBind.DataReaderToListNoUsing(typeof(T), dataReader); + NextResult(dataReader); + List result2 = this.DbBind.DataReaderToListNoUsing(typeof(T2), dataReader); + NextResult(dataReader); + List result3 = this.DbBind.DataReaderToListNoUsing(typeof(T3), dataReader); + NextResult(dataReader); + List result4 = this.DbBind.DataReaderToListNoUsing(typeof(T4), dataReader); + NextResult(dataReader); + List result5 = this.DbBind.DataReaderToListNoUsing(typeof(T5), dataReader); + NextResult(dataReader); + List result6 = this.DbBind.DataReaderToListNoUsing(typeof(T6), dataReader); + NextResult(dataReader); + List result7 = this.DbBind.DataReaderToListNoUsing(typeof(T7), dataReader); + builder.SqlQueryBuilder.Clear(); + if (this.Context.Ado.DataReaderParameters != null) + { + foreach (IDataParameter item in this.Context.Ado.DataReaderParameters) + { + var parameter = parsmeterArray.FirstOrDefault(it => item.ParameterName.Substring(1) == it.ParameterName.Substring(1)); + if (parameter != null) + { + parameter.Value = item.Value; + } + } + this.Context.Ado.DataReaderParameters = null; + } + return Tuple.Create, List, List, List, List, List, List>(result, result2, result3, result4, result5, result6, result7); + } + } + + private static void NextResult(IDataReader dataReader) + { + try + { + dataReader.NextResult(); + } + catch + { + Check.Exception(true, ErrorMessage.GetThrowMessage("Please reduce the number of T. Save Queue Changes queries don't have so many results", "请减少T的数量,SaveQueueChanges 查询没有这么多结果")); + } + } public virtual T SqlQuerySingle(string sql, object parameters = null) { var result = SqlQuery(sql, parameters); diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs index 2809976ea..3769ac0ce 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs @@ -187,7 +187,7 @@ namespace SqlSugar { return GetKeyValueList(type, dataReader); } - else if (type.IsValueType() || type == UtilConstants.StringType||type== UtilConstants.ByteArrayType) + else if (type.IsValueType() || type == UtilConstants.StringType || type == UtilConstants.ByteArrayType) { return GetValueTypeList(type, dataReader); } @@ -201,6 +201,25 @@ namespace SqlSugar } } } + public virtual List DataReaderToListNoUsing(Type type, IDataReader dataReader) + { + if (type.Name.Contains("KeyValuePair")) + { + return GetKeyValueList(type, dataReader); + } + else if (type.IsValueType() || type == UtilConstants.StringType || type == UtilConstants.ByteArrayType) + { + return GetValueTypeList(type, dataReader); + } + else if (type.IsArray) + { + return GetArrayList(type, dataReader); + } + else + { + return GetEntityList(Context, dataReader); + } + } #endregion #region Throw rule diff --git a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs index 2a8e40fff..14cd76be2 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs @@ -41,7 +41,11 @@ namespace SqlSugar After(sql); return result; } - + public void AddQueue() + { + var sqlObj = this.ToSql(); + this.Context.Queues.Add(sqlObj.Key, sqlObj.Value); + } public bool ExecuteCommandHasChange() { return ExecuteCommand() > 0; diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs index ead4b1aa5..cf1d700e5 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs @@ -33,6 +33,11 @@ namespace SqlSugar #region Core + public void AddQueue() + { + var sqlObj = this.ToSql(); + this.Context.Queues.Add(sqlObj.Key, sqlObj.Value); + } public virtual int ExecuteCommand() { if (InsertBuilder.DbColumnInfoList.HasValue()) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 953c205d9..3e9cf9f20 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -50,7 +50,11 @@ namespace SqlSugar { QueryBuilder.Clear(); } - + public void AddQueue() + { + var sqlObj = this.ToSql(); + this.Context.Queues.Add(sqlObj.Key,sqlObj.Value); + } public ISugarQueryable Clone() { var queryable = this.Context.Queryable().WithCacheIF(IsCache, CacheTime); diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index 8d0e10853..3f6117d02 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs @@ -32,7 +32,11 @@ namespace SqlSugar public bool IsEnableDiffLogEvent { get; set; } public DiffLogModel diffModel { get; set; } private Action RemoveCacheFunc { get; set; } - + public void AddQueue() + { + var sqlObj = this.ToSql(); + this.Context.Queues.Add(sqlObj.Key, sqlObj.Value); + } public virtual int ExecuteCommand() { PreToSql(); diff --git a/Src/Asp.Net/SqlSugar/Entities/QueueItem.cs b/Src/Asp.Net/SqlSugar/Entities/QueueItem.cs new file mode 100644 index 000000000..295d57949 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Entities/QueueItem.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SqlSugar +{ + public class QueueItem + { + public string Sql { get; set; } + public SugarParameter[] Parameters { get; set; } + } +} diff --git a/Src/Asp.Net/SqlSugar/Entities/SugarList.cs b/Src/Asp.Net/SqlSugar/Entities/SugarList.cs index 90985889a..43e5ffbf2 100644 --- a/Src/Asp.Net/SqlSugar/Entities/SugarList.cs +++ b/Src/Asp.Net/SqlSugar/Entities/SugarList.cs @@ -19,7 +19,7 @@ namespace SqlSugar } public new void Clear() { - this.RemoveAll(it=>true); + this.RemoveAll(it => true); } } @@ -27,7 +27,7 @@ namespace SqlSugar { public void Add(string propertyName, string EntityName) { - this.RemoveAll(it =>it.EntityName==EntityName&&it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase)); + this.RemoveAll(it => it.EntityName == EntityName && it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase)); this.Add(new IgnoreColumn() { PropertyName = propertyName, EntityName = EntityName }); } @@ -41,7 +41,7 @@ namespace SqlSugar { public void Add(string propertyName, string dbColumnName, string entityName) { - this.RemoveAll(it =>it.EntityName==entityName &&it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase)); + this.RemoveAll(it => it.EntityName == entityName && it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase)); this.Add(new MappingColumn() { PropertyName = propertyName, DbColumnName = dbColumnName, EntityName = entityName }); } public new void Clear() @@ -49,4 +49,23 @@ namespace SqlSugar this.RemoveAll(it => true); } } + + + public class QueueList : List + { + public void Add(string sql, SugarParameter[] parameters) + { + this.Add(new QueueItem() { Sql = sql, Parameters = parameters }); + } + public void Add(string sql, List parameters) + { + if (parameters == null) + parameters = new List(); + this.Add(new QueueItem() { Sql = sql, Parameters = parameters.ToArray() }); + } + public new void Clear() + { + this.RemoveAll(it => true); + } + } } diff --git a/Src/Asp.Net/SqlSugar/Interface/IAdo.cs b/Src/Asp.Net/SqlSugar/Interface/IAdo.cs index 8e2dd82ef..43d793ed1 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IAdo.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IAdo.cs @@ -67,6 +67,13 @@ namespace SqlSugar DateTime GetDateTime(string sql, params SugarParameter[] parameters); DateTime GetDateTime(string sql, List parameters); List SqlQuery(string sql, object parameters = null); + Tuple, List> SqlQuery(string sql, object parameters = null); + Tuple, List, List> SqlQuery(string sql, object parameters = null); + Tuple, List, List,List> SqlQuery(string sql, object parameters = null); + Tuple, List, List, List, List> SqlQuery(string sql, object parameters = null); + Tuple, List, List, List, List, List> SqlQuery(string sql, object parameters = null); + Tuple, List, List, List, List, List, List> SqlQuery(string sql, object parameters = null); + List SqlQuery(string sql, params SugarParameter[] parameters); List SqlQuery(string sql, List parameters); T SqlQuerySingle(string sql, object whereObj = null); diff --git a/Src/Asp.Net/SqlSugar/Interface/IDbBind.cs b/Src/Asp.Net/SqlSugar/Interface/IDbBind.cs index 03811c309..7539c9723 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IDbBind.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IDbBind.cs @@ -21,5 +21,6 @@ namespace SqlSugar string GetCsharpTypeName(string dbTypeName); List> MappingTypes { get; } List DataReaderToList(Type type, IDataReader reader); + List DataReaderToListNoUsing(Type type, IDataReader reader); } } diff --git a/Src/Asp.Net/SqlSugar/Interface/IDeleteable.cs b/Src/Asp.Net/SqlSugar/Interface/IDeleteable.cs index 418da3063..b292d6db8 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IDeleteable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IDeleteable.cs @@ -32,5 +32,6 @@ namespace SqlSugar IDeleteable EnableDiffLogEvent(object businessData = null); IDeleteable RemoveDataCache(); KeyValuePair> ToSql(); + void AddQueue(); } } diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index e1d7a6e2c..072970474 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -145,6 +145,7 @@ namespace SqlSugar ISugarQueryable WithCacheIF(bool isCache, int cacheDurationInSeconds = int.MaxValue); string ToClassString(string className); void Clear(); + void AddQueue(); } public partial interface ISugarQueryable : ISugarQueryable { diff --git a/Src/Asp.Net/SqlSugar/Interface/IUpdateable.cs b/Src/Asp.Net/SqlSugar/Interface/IUpdateable.cs index 51f187246..67b9b6cf4 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IUpdateable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IUpdateable.cs @@ -55,5 +55,6 @@ namespace SqlSugar IUpdateable ReSetValue(Expression> setValueExpression); IUpdateable RemoveDataCache(); KeyValuePair> ToSql(); + void AddQueue(); } } diff --git a/Src/Asp.Net/SqlSugar/Interface/Insertable.cs b/Src/Asp.Net/SqlSugar/Interface/Insertable.cs index 5091f4952..465f922b9 100644 --- a/Src/Asp.Net/SqlSugar/Interface/Insertable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/Insertable.cs @@ -31,5 +31,6 @@ namespace SqlSugar IInsertable EnableDiffLogEvent(object businessData = null); IInsertable RemoveDataCache(); KeyValuePair> ToSql(); + void AddQueue(); } } diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 40dc2f2d1..a28493e6d 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -82,6 +82,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs index 4010887dd..4e8fbe0af 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs @@ -97,14 +97,15 @@ namespace SqlSugar /// Get datebase time /// /// - public DateTime GetDate() { + public DateTime GetDate() + { var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); return this.Ado.GetDateTime(sqlBuilder.FullSqlDateNow); } /// /// Lambda Query operation /// - public virtual ISugarQueryable Queryable() + public virtual ISugarQueryable Queryable() { InitMppingInfo(); @@ -130,7 +131,7 @@ namespace SqlSugar queryable.SqlBuilder.QueryBuilder.TableShortName = shortName; return queryable; } - public virtual ISugarQueryable Queryable(Expression> joinExpression) + public virtual ISugarQueryable Queryable(Expression> joinExpression) { InitMppingInfo(); var types = new Type[] { typeof(T2) }; @@ -138,7 +139,7 @@ namespace SqlSugar this.CreateQueryJoin(joinExpression, types, queryable); return queryable; } - public virtual ISugarQueryable Queryable(Expression> joinExpression) + public virtual ISugarQueryable Queryable(Expression> joinExpression) { InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3) }; @@ -146,7 +147,7 @@ namespace SqlSugar this.CreateQueryJoin(joinExpression, types, queryable); return queryable; } - public virtual ISugarQueryable Queryable(Expression> joinExpression) + public virtual ISugarQueryable Queryable(Expression> joinExpression) { InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4) }; @@ -154,7 +155,7 @@ namespace SqlSugar this.CreateQueryJoin(joinExpression, types, queryable); return queryable; } - public virtual ISugarQueryable Queryable(Expression> joinExpression) + public virtual ISugarQueryable Queryable(Expression> joinExpression) { InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5) }; @@ -162,7 +163,7 @@ namespace SqlSugar this.CreateQueryJoin(joinExpression, types, queryable); return queryable; } - public virtual ISugarQueryable Queryable(Expression> joinExpression) + public virtual ISugarQueryable Queryable(Expression> joinExpression) { InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6) }; @@ -170,7 +171,7 @@ namespace SqlSugar this.CreateQueryJoin(joinExpression, types, queryable); return queryable; } - public virtual ISugarQueryable Queryable(Expression> joinExpression) + public virtual ISugarQueryable Queryable(Expression> joinExpression) { InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7) }; @@ -178,7 +179,7 @@ namespace SqlSugar this.CreateQueryJoin(joinExpression, types, queryable); return queryable; } - public virtual ISugarQueryable Queryable(Expression> joinExpression) + public virtual ISugarQueryable Queryable(Expression> joinExpression) { InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8) }; @@ -203,7 +204,7 @@ namespace SqlSugar this.CreateQueryJoin(joinExpression, types, queryable); return queryable; } - public virtual ISugarQueryable Queryable(Expression> joinExpression) + public virtual ISugarQueryable Queryable(Expression> joinExpression) { InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11) }; @@ -211,7 +212,7 @@ namespace SqlSugar this.CreateQueryJoin(joinExpression, types, queryable); return queryable; } - public virtual ISugarQueryable Queryable(Expression> joinExpression) + public virtual ISugarQueryable Queryable(Expression> joinExpression) { InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12) }; @@ -267,7 +268,7 @@ namespace SqlSugar } public virtual ISugarQueryable Queryable(Expression> joinExpression) where T : class, new() { - InitMppingInfo(); + InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7) }; var queryable = InstanceFactory.GetQueryable(this.CurrentConnectionConfig); this.CreateEasyQueryJoin(joinExpression, types, queryable); @@ -276,7 +277,7 @@ namespace SqlSugar } public virtual ISugarQueryable Queryable(Expression> joinExpression) where T : class, new() { - InitMppingInfo(); + InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8) }; var queryable = InstanceFactory.GetQueryable(this.CurrentConnectionConfig); this.CreateEasyQueryJoin(joinExpression, types, queryable); @@ -287,7 +288,7 @@ namespace SqlSugar #region 9-12 public virtual ISugarQueryable Queryable(Expression> joinExpression) where T : class, new() { - InitMppingInfo(); + InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9) }; var queryable = InstanceFactory.GetQueryable(this.CurrentConnectionConfig); this.CreateEasyQueryJoin(joinExpression, types, queryable); @@ -296,7 +297,7 @@ namespace SqlSugar } public virtual ISugarQueryable Queryable(Expression> joinExpression) where T : class, new() { - InitMppingInfo(); + InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10) }; var queryable = InstanceFactory.GetQueryable(this.CurrentConnectionConfig); this.CreateEasyQueryJoin(joinExpression, types, queryable); @@ -305,7 +306,7 @@ namespace SqlSugar } public virtual ISugarQueryable Queryable(Expression> joinExpression) where T : class, new() { - InitMppingInfo(); + InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11) }; var queryable = InstanceFactory.GetQueryable(this.CurrentConnectionConfig); this.CreateEasyQueryJoin(joinExpression, types, queryable); @@ -314,7 +315,7 @@ namespace SqlSugar } public virtual ISugarQueryable Queryable(Expression> joinExpression) where T : class, new() { - InitMppingInfo(); + InitMppingInfo(); var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12) }; var queryable = InstanceFactory.GetQueryable(this.CurrentConnectionConfig); this.CreateEasyQueryJoin(joinExpression, types, queryable); @@ -356,7 +357,7 @@ namespace SqlSugar var shortName1 = joinExpression.Parameters[0].Name; var sqlObj1 = joinQueryable1.ToSql(); string sql1 = sqlObj1.Key; - UtilMethods.RepairReplicationParameters(ref sql1, sqlObj1.Value.ToArray(), 0,"Join"); + UtilMethods.RepairReplicationParameters(ref sql1, sqlObj1.Value.ToArray(), 0, "Join"); queryable.QueryBuilder.EntityName = sqlBuilder.GetPackTable(sql1, shortName1); ; queryable.QueryBuilder.Parameters.AddRange(sqlObj1.Value); @@ -435,7 +436,7 @@ namespace SqlSugar public ISugarQueryable SqlQueryable(string sql) where T : class, new() { var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); - return this.Context.Queryable().AS(sqlBuilder.GetPackTable(sql, sqlBuilder.GetDefaultShortName())).With(SqlWith.Null).Select(sqlBuilder.GetDefaultShortName()+".*"); + return this.Context.Queryable().AS(sqlBuilder.GetPackTable(sql, sqlBuilder.GetDefaultShortName())).With(SqlWith.Null).Select(sqlBuilder.GetDefaultShortName() + ".*"); } #endregion @@ -537,8 +538,8 @@ namespace SqlSugar } public virtual IUpdateable Updateable() where T : class, new() { - var result= this.Context.Updateable(new T[] { new T() }); - result.UpdateParameterIsNull=true; + var result = this.Context.Updateable(new T[] { new T() }); + result.UpdateParameterIsNull = true; return result; } public virtual IUpdateable Updateable(Dictionary columnDictionary) where T : class, new() @@ -567,13 +568,13 @@ namespace SqlSugar #endregion #region Saveable - public ISaveable Saveable(List saveObjects)where T:class,new() + public ISaveable Saveable(List saveObjects) where T : class, new() { - return new SaveableProvider(this,saveObjects); + return new SaveableProvider(this, saveObjects); } public ISaveable Saveable(T saveObject) where T : class, new() { - return new SaveableProvider(this,saveObject); + return new SaveableProvider(this, saveObject); } #endregion @@ -696,5 +697,142 @@ namespace SqlSugar this.Context.Ado.Dispose(); } #endregion + + #region Queue + public int SaveQueues(bool isTran = true) + { + return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.ExecuteCommand(sql, parameters); }); + } + + public Task SaveQueuesAsync(bool isTran = true) + { + var result = new Task(() => { return SaveQueues(isTran); }); + result.Start(); + return result; + } + public List SaveQueues(bool isTran = true) + { + return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery(sql, parameters); }); + } + public Task> SaveQueuesAsync(bool isTran = true) + { + var result = new Task>(() => { return SaveQueues(); }); + result.Start(); + return result; + } + public Tuple, List> SaveQueues(bool isTran = true) + { + return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery(sql, parameters); }); + } + public Task, List>> SaveQueuesAsync(bool isTran = true) + { + var result = new Task, List>>(() => { return SaveQueues(isTran); }); + result.Start(); + return result; + } + public Tuple, List, List> SaveQueues(bool isTran = true) + { + return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery(sql, parameters); }); + } + public Task, List, List>> SaveQueuesAsync(bool isTran = true) + { + var result = new Task, List, List>>(() => { return SaveQueues(isTran); }); + result.Start(); + return result; + } + public Tuple, List, List, List> SaveQueues(bool isTran = true) + { + return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery(sql, parameters); }); + } + public Task, List, List, List>> SaveQueuesAsync(bool isTran = true) + { + var result = new Task, List, List, List>>(() => { return SaveQueues(isTran); }); + result.Start(); + return result; + } + public Tuple, List, List, List, List> SaveQueues(bool isTran = true) + { + return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery(sql, parameters); }); + } + public Task, List, List, List, List>> SaveQueuesAsync(bool isTran = true) + { + var result = new Task, List, List, List, List>>(() => { return SaveQueues(isTran); }); + result.Start(); + return result; + } + public Tuple, List, List, List, List, List> SaveQueues(bool isTran = true) + { + return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery(sql, parameters); }); + } + public Task, List, List, List, List, List>> SaveQueuesAsync(bool isTran = true) + { + var result = new Task, List, List, List, List, List>>(() => { return SaveQueues(isTran); }); + result.Start(); + return result; + } + public Tuple, List, List, List, List, List, List> SaveQueues(bool isTran = true) + { + return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery(sql, parameters); }); + } + public Task, List, List, List, List, List, List>> SaveQueuesAsync(bool isTran = true) + { + var result = new Task, List, List, List, List, List, List>>(() => { return SaveQueues(isTran); }); + result.Start(); + return result; + } + public void AddQueue(string sql, object parsmeters=null) + { + if (Queues == null) + { + Queues = new QueueList(); + } + this.Queues.Add(sql,this.Context.Ado.GetParameters(parsmeters)); + } + public QueueList Queues = new QueueList(); + + private T SaveQueuesProvider(bool isTran, Func, T> func) + { + try + { + if (this.Queues == null || this.Queues.Count == 0) return default(T); + isTran = isTran && this.Ado.Transaction == null; + if (isTran) this.Ado.BeginTran(); + StringBuilder sqlBuilder = new StringBuilder(); + var parsmeters = new List(); + var index = 1; + if (this.Queues.HasValue()) + { + foreach (var item in Queues) + { + if (item.Sql == null) + item.Sql = string.Empty; + if (item.Parameters == null) + item.Parameters = new SugarParameter[] { }; + var itemParsmeters = item.Parameters.OrderByDescending(it => it.ParameterName).ToList(); + var itemSql = item.Sql; + foreach (var itemParameter in itemParsmeters) + { + var newName = itemParameter.ParameterName + "_q_" + index; + itemSql = itemSql.Replace(itemParameter.ParameterName, newName); + itemParameter.ParameterName = newName; + } + parsmeters.AddRange(itemParsmeters); + sqlBuilder.AppendLine(itemSql); + index++; + } + } + this.Queues.Clear(); + var result = func(sqlBuilder.ToString(), parsmeters); + if (isTran) this.Ado.CommitTran(); + return result; + } + catch (Exception ex) + { + if (isTran) this.Ado.RollbackTran(); + throw ex; + } + } + + #endregion } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite b/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite index 9e90974b1..3622af2a4 100644 Binary files a/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite and b/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite differ