diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/Reportable/ReportableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/Reportable/ReportableProvider.cs index 46ad01d31..646dbeee1 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/Reportable/ReportableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/Reportable/ReportableProvider.cs @@ -218,7 +218,23 @@ namespace SqlSugar } else if (type.IsIn(typeof(DateTime))) { - Expression, object>> exp = it => Convert.ToDecimal(it.ColumnName); + if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle) + { + return queryBuilder.LambdaExpressions.DbMehtods.Oracle_ToDate(new MethodCallExpressionModel() + { + Args = new List() { + new MethodCallExpressionArgs(){ + IsMember=true, + MemberName= value.ObjToDate().ToString("yyyy-MM-dd HH:mm:ss").ToSqlValue() + }, + new MethodCallExpressionArgs(){ + IsMember=true, + MemberName= "yyyy-mm-dd hh24:mi:ss".ToSqlValue() + } + } + }); ; + } + //Expression, object>> exp = it => Convert.ToDecimal(it.ColumnName); var result = queryBuilder.LambdaExpressions.DbMehtods.ToDate(new MethodCallExpressionModel() { Args = new List() { diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs index 5cc3a0f05..8fff99f08 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs @@ -68,6 +68,22 @@ namespace SqlSugar return this; } + public int ExecuteCommand() + { + var result = 0; + var x = this.ToStorage(); + result+=x.AsInsertable.ExecuteCommand(); + result += x.AsUpdateable.ExecuteCommand(); + return result; + } + public async Task ExecuteCommandAsync() + { + var result = 0; + var x = await this.ToStorageAsync(); + result +=await x.AsInsertable.ExecuteCommandAsync(); + result +=await x.AsUpdateable.ExecuteCommandAsync(); + return result; + } public StorageableResult ToStorage() { if (whereFuncs == null || whereFuncs.Count == 0) @@ -148,6 +164,89 @@ namespace SqlSugar return result; } + + public async Task> ToStorageAsync() + { + if (whereFuncs == null || whereFuncs.Count == 0) + { + return await this.Saveable().ToStorageAsync(); + } + if (this.allDatas.Count == 0) + return new StorageableResult() + { + AsDeleteable = this.Context.Deleteable().AS(asname).Where(it => false), + AsInsertable = this.Context.Insertable(new List()).AS(asname), + AsUpdateable = this.Context.Updateable(new List()).AS(asname), + InsertList = new List>(), + UpdateList = new List>(), + DeleteList = new List>(), + ErrorList = new List>(), + IgnoreList = new List>(), + OtherList = new List>(), + TotalList = new List>() + }; + var pkInfos = this.Context.EntityMaintenance.GetEntityInfo().Columns.Where(it => it.IsPrimarykey); + if (whereExpression == null && !pkInfos.Any()) + { + Check.Exception(true, "Need primary key or WhereColumn"); + } + if (whereExpression == null && pkInfos.Any()) + { + await this.Context.Utilities.PageEachAsync(allDatas, 300,async item => { + var addItems =await this.Context.Queryable().AS(asname).WhereClassByPrimaryKey(item.Select(it => it.Item).ToList()).ToListAsync(); + dbDataList.AddRange(addItems); + }); + } + var pkProperties = GetPkProperties(pkInfos); + var messageList = allDatas.Select(it => new StorageableMessage() + { + Item = it.Item, + Database = dbDataList, + PkFields = pkProperties + }).ToList(); + foreach (var item in whereFuncs.OrderByDescending(it => (int)it.key)) + { + List> whereList = messageList.Where(it => it.StorageType == null).ToList(); + Func, bool> exp = item.value1; + var list = whereList.Where(exp).ToList(); + foreach (var it in list) + { + it.StorageType = item.key; + it.StorageMessage = item.value2; + } + } + var delete = messageList.Where(it => it.StorageType == StorageType.Delete).ToList(); + var update = messageList.Where(it => it.StorageType == StorageType.Update).ToList(); + var inset = messageList.Where(it => it.StorageType == StorageType.Insert).ToList(); + var error = messageList.Where(it => it.StorageType == StorageType.Error).ToList(); + var ignore = messageList.Where(it => it.StorageType == StorageType.Ignore || it.StorageType == null).ToList(); + var other = messageList.Where(it => it.StorageType == StorageType.Other).ToList(); + StorageableResult result = new StorageableResult() + { + _WhereColumnList = wherecolumnList, + _AsName = asname, + _Context = this.Context, + AsDeleteable = this.Context.Deleteable().AS(asname), + AsUpdateable = this.Context.Updateable(update.Select(it => it.Item).ToList()).AS(asname), + AsInsertable = this.Context.Insertable(inset.Select(it => it.Item).ToList()).AS(asname), + OtherList = other, + InsertList = inset, + DeleteList = delete, + UpdateList = update, + ErrorList = error, + IgnoreList = ignore, + TotalList = messageList + }; + if (this.whereExpression != null) + { + result.AsUpdateable.WhereColumns(whereExpression); + result.AsDeleteable.WhereColumns(whereExpression); + } + result.AsDeleteable.Where(delete.Select(it => it.Item).ToList()); + return result; + } + + private string[] GetPkProperties(IEnumerable pkInfos) { if (whereExpression == null) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs index 79f59ab20..0f22a2399 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs @@ -331,7 +331,10 @@ namespace SqlSugar } return new KeyValuePair(builder.ToString(), parameters.ToArray()); } - + public virtual string GetUnionFomatSql(string sql) + { + return sql; + } private void BuilderTree(StringBuilder builder,ConditionalTree item,ref int indexTree, List parameters,ref int mainIndex) { var conditionals = ToConditionalCollections(item,ref indexTree, parameters); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index c5dfb8e02..ee7baa81f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -520,9 +520,9 @@ namespace SqlSugar string sql = sqlObj.Key; UtilMethods.RepairReplicationParameters(ref sql, sqlObj.Value.ToArray(), i, "UnionAll"); if (sqlObj.Value.HasValue()) - allItems.Add(new KeyValuePair>(sql, sqlObj.Value)); + allItems.Add(new KeyValuePair>(sqlBuilder.GetUnionFomatSql(sql), sqlObj.Value)); else - allItems.Add(new KeyValuePair>(sql, new List())); + allItems.Add(new KeyValuePair>(sqlBuilder.GetUnionFomatSql(sql), new List())); i++; } var allSql = sqlBuilder.GetUnionAllSql(allItems.Select(it => it.Key).ToList()); @@ -557,9 +557,9 @@ namespace SqlSugar string sql = sqlObj.Key; UtilMethods.RepairReplicationParameters(ref sql, sqlObj.Value.ToArray(), i, "Union"); if (sqlObj.Value.HasValue()) - allItems.Add(new KeyValuePair>($" ( {sql} ) ", sqlObj.Value)); + allItems.Add(new KeyValuePair>(sqlBuilder.GetUnionFomatSql(sql), sqlObj.Value)); else - allItems.Add(new KeyValuePair>($" ( {sql} ) ", new List())); + allItems.Add(new KeyValuePair>(sqlBuilder.GetUnionFomatSql(sql), new List())); i++; } var allSql = sqlBuilder.GetUnionSql(allItems.Select(it => it.Key).ToList()); diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/DateType.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/DateType.cs index bb5f71d76..d25d9ab45 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/DateType.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/DateType.cs @@ -15,6 +15,7 @@ namespace SqlSugar Second=5, Minute=6, Millisecond=7, - Weekday=8 + Weekday=8, + Quarter=9 } } diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/ISqlBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Interface/ISqlBuilder.cs index ce1374191..50c4f249b 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/ISqlBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/ISqlBuilder.cs @@ -41,5 +41,6 @@ namespace SqlSugar string GetUnionSql(List sqlList); void RepairReplicationParameters(ref string appendSql, SugarParameter[] parameters, int addIndex); KeyValuePair ConditionalModelToSql(List models, int beginIndex = 0); + string GetUnionFomatSql(string sql); } } diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IStorageable.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IStorageable.cs index beb67ce28..cb52c65bd 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IStorageable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IStorageable.cs @@ -17,7 +17,10 @@ namespace SqlSugar IStorageable SplitDelete(Func, bool> conditions, string message = null); IStorageable SplitOther(Func, bool> conditions, string message = null); StorageableResult ToStorage(); + Task> ToStorageAsync(); IStorageable As(string tableName); + int ExecuteCommand(); + Task ExecuteCommandAsync(); } public class StorageableInfo where T : class, new() diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlBuilder.cs index 51152c06b..3a35e12fd 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlBuilder.cs @@ -22,5 +22,9 @@ namespace SqlSugar return "select sysdate()"; } } + public override string GetUnionFomatSql(string sql) + { + return " ( " + sql + " ) "; + } } } diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlExpressionContext.cs index 328e222d8..e7f7835a2 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlExpressionContext.cs @@ -76,6 +76,11 @@ namespace SqlSugar var parameter = model.Args[0]; var parameter2 = model.Args[1]; var parameter3 = model.Args[2]; + if (parameter3.MemberValue.ObjToString() == "Millisecond") + { + parameter3.MemberValue = "Second"; + return string.Format(" (DATE_ADD({1} , INTERVAL {2}/1000 {0})) ", parameter3.MemberValue, parameter.MemberName, parameter2.MemberName); + } return string.Format(" (DATE_ADD({1} , INTERVAL {2} {0})) ", parameter3.MemberValue, parameter.MemberName, parameter2.MemberName); } diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs index 7c321a54d..2dab8582d 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs @@ -34,6 +34,10 @@ namespace SqlSugar { if (columnName.Contains(":")) return base.GetTranslationColumnName(columnName); + else if (columnName.Contains("\".\"")) + { + return columnName; + } else return base.GetTranslationColumnName(columnName).ToUpper(); } diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs index 9204ecd93..27a20a7bb 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs @@ -65,7 +65,7 @@ namespace SqlSugar batchInsetrSql.Append("("); - insertColumns = string.Join(",", item.Select(it =>FormatValue(it.Value))); + insertColumns = string.Join(",", item.Select(it =>FormatValue(it.Value,it.PropertyName))); batchInsetrSql.Append(insertColumns); if (identities.HasValue()) { @@ -99,7 +99,8 @@ namespace SqlSugar return result; } } - public override object FormatValue(object value) + int i = 0; + public object FormatValue(object value,string name) { if (value == null) { @@ -144,7 +145,10 @@ namespace SqlSugar { if (value.ToString().Length > 2000) { - return "to_clob('" + value.ToString().ToSqlFilter() + "')"; + ++i; + var parameterName = this.Builder.SqlParameterKeyWord + name + i; + this.Parameters.Add(new SugarParameter(parameterName, value)); + return parameterName; } else { diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs index 2eb282f3e..171e561b4 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs @@ -33,10 +33,10 @@ namespace SqlSugar private string GetOracleUpdateColums(DbColumnInfo m) { - return string.Format("\"{0}\"={1}", m.DbColumnName.ToUpper(), FormatValue(m.Value)); + return string.Format("\"{0}\"={1}", m.DbColumnName.ToUpper(), FormatValue(m.Value,m.IsPrimarykey)); } - public override object FormatValue(object value) + public object FormatValue(object value,bool isPrimaryKey) { if (value == null) { @@ -45,6 +45,10 @@ namespace SqlSugar else { string N =this.Context.GetN(); + if (isPrimaryKey) + { + N = ""; + } var type = UtilMethods.GetUnderType(value.GetType()); if (type == UtilConstants.DateType) { diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLBuilder.cs index e2dae2912..fef7d4b78 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLBuilder.cs @@ -98,5 +98,9 @@ namespace SqlSugar return SqlTranslationLeft + name.ToLower(isAutoToLower).TrimEnd('"').TrimStart('"') + SqlTranslationRight; } } + public override string GetUnionFomatSql(string sql) + { + return " ( " + sql + " ) "; + } } } diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs index a743ffb1a..03744c06b 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs @@ -360,11 +360,13 @@ namespace SqlSugar Check.Exception(typeof(T).FullName.Contains("System.Collections.Generic.List`"), " need where T: class, new() "); return this.Context.Storageable(new List { data}); } + + [Obsolete("use Storageable")] public ISaveable Saveable(List saveObjects) where T : class, new() { return this.Context.Saveable(saveObjects); } - + [Obsolete("use Storageable")] public ISaveable Saveable(T saveObject) where T : class, new() { return this.Context.Saveable(saveObject); diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs index a2b372d97..1db7cb3fe 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs @@ -436,11 +436,13 @@ namespace SqlSugar ScopedContext.RollbackTran(); } + + [Obsolete("use Storageable")] public ISaveable Saveable(List saveObjects) where T : class, new() { return ScopedContext.Saveable(saveObjects); } - + [Obsolete("use Storageable")] public ISaveable Saveable(T saveObject) where T : class, new() { return ScopedContext.Saveable(saveObject);