From 3e8ff391cfef69d16816a8a6fe2099fc35d0302d Mon Sep 17 00:00:00 2001 From: sunkaixuna <610262374@qq.com> Date: Sun, 26 Sep 2021 23:28:47 +0800 Subject: [PATCH] Update Core --- .../Abstract/AdoProvider/AdoProvider.cs | 4 ++ .../DeleteProvider/DeleteableProvider.cs | 4 ++ .../SqlBuilderProvider/QueryBuilder.cs | 9 ++-- .../SqlBuilderProvider/UpdateBuilder.cs | 11 ++-- .../SqlSeverTest/SqlSugar/Enum/DbType.cs | 2 +- .../ResolveItems/BaseResolve.cs | 2 +- .../MethodCallExpressionResolve.cs | 8 +++ .../ExpressionsToSql/Subquery/Items/SubAnd.cs | 20 +++++++- .../Subquery/Items/SubHaving.cs | 51 +++++++++++++++++++ .../Subquery/Items/SubWhere.cs | 20 +++++++- .../ExpressionsToSql/Subquery/SubTools.cs | 3 +- .../ExpressionsToSql/Subquery/Subquerable.cs | 8 +++ .../SqlSugar/Infrastructure/ContextMethods.cs | 2 +- .../Realization/Dm/DbBind/DmDbBind.cs | 1 + .../MySql/SqlBuilder/MySqlBlukCopy.cs | 18 ++++--- .../MySql/SqlBuilder/MySqlQueryBuilder.cs | 2 +- .../SqlBuilder/PostgreSQLExpressionContext.cs | 33 +++++++++++- .../SqlSugar/Utilities/ValidateExtensions.cs | 2 +- 18 files changed, 173 insertions(+), 27 deletions(-) create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubHaving.cs diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs index 5707e3974..3290eca6b 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs @@ -863,6 +863,10 @@ namespace SqlSugar { result = GetData(typeof(T), dataReader); } + else + { + dataReader.Read(); + } List result2 = null; if (NextResult(dataReader)) { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs index 311aac329..766d2cb9e 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs @@ -144,6 +144,10 @@ namespace SqlSugar { andString.AppendFormat(DeleteBuilder.WhereInEqualTemplate, primaryField.ToUpper(), entityValue); } + else if (this.Context.CurrentConnectionConfig.DbType == DbType.PostgreSQL&& (this.Context.CurrentConnectionConfig.MoreSettings==null||this.Context.CurrentConnectionConfig.MoreSettings?.PgSqlIsAutoToLower==true)) + { + andString.AppendFormat("\"{0}\"={1} ", primaryField.ToLower(), new PostgreSQLExpressionContext().GetValue(entityValue)); + } else { andString.AppendFormat(DeleteBuilder.WhereInEqualTemplate, primaryField, entityValue); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index 0a23aa8c5..b0aedbf7e 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -336,6 +336,10 @@ namespace SqlSugar var exp=field.GetValue(item,null) as Expression; var isMain = ChildType == this.EntityType; var isSingle = IsSingle(); + if (ChildType != this.EntityType&&isSingle) + { + return; + } var expValue = GetExpressionValue(exp, isSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple); var sql = expValue.GetResultString(); var itName = (exp as LambdaExpression).Parameters[0].Name; @@ -350,10 +354,7 @@ namespace SqlSugar } if (isSingle) { - if (ChildType != this.EntityType) - { - return; - } + } else if (isMain) { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index 86f0c1e76..6b94bfd94 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs @@ -257,11 +257,14 @@ namespace SqlSugar } else if (PrimaryKeys.HasValue()) { - foreach (var item in PrimaryKeys) + if (IsWhereColumns == false) { - var isFirst = whereString == null; - whereString += (isFirst ? " WHERE " : " AND "); - whereString += Builder.GetTranslationColumnName(item) + "=" + this.Context.Ado.SqlParameterKeyWord + item; + foreach (var item in PrimaryKeys) + { + var isFirst = whereString == null; + whereString += (isFirst ? " WHERE " : " AND "); + whereString += Builder.GetTranslationColumnName(item) + "=" + this.Context.Ado.SqlParameterKeyWord + item; + } } } if (PrimaryKeys.HasValue()&&IsWhereColumns) diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Enum/DbType.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Enum/DbType.cs index 80b3414e1..bac17890e 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Enum/DbType.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Enum/DbType.cs @@ -14,6 +14,6 @@ namespace SqlSugar PostgreSQL, Dm, Kdbndp, - Oscar + Oscar } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs index 0754ff225..3388164ae 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs @@ -542,7 +542,7 @@ namespace SqlSugar } } } - if (types.Count == i) + if (types.Count == i&&(types.Count==types.Distinct().Count())) { return result; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index 82c90cb03..3bac0119d 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -292,6 +292,14 @@ namespace SqlSugar break; case ResolveExpressType.FieldSingle: case ResolveExpressType.FieldMultiple: + if (express.Method.Name == "ToString" && express.Object!=null&&express.Object?.Type == UtilConstants.DateType) + { + var format = (args[0] as ConstantExpression).Value+""; + var value = GetNewExpressionValue(express.Object); + var dateString = GeDateFormat(format, value); + base.AppendValue(parameter, isLeft, dateString); + } + break; default: break; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs index b96d64706..1058d6bb4 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs @@ -55,8 +55,19 @@ namespace SqlSugar } if (Regex.IsMatch(result, regex)) { - result = "AND " + this.Context.Parameters.First(it => it.ParameterName == Regex.Match(result, regex).Groups[1].Value).Value; - return result; + var value = GetValue(result, regex); + if (value is Expression) + { + var p = this.Context.Parameters.First(it => it.ParameterName == Regex.Match(result, regex).Groups[1].Value); + result = "AND " + SubTools.GetMethodValue(Context, value as Expression, ResolveExpressType.WhereMultiple); + argExp = value as Expression; + this.Context.Parameters.Remove(p); + } + else + { + result = "AND " + value; + return result; + } } var selfParameterName = this.Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; @@ -64,5 +75,10 @@ namespace SqlSugar result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); return result; } + + private object GetValue(string result, string regex) + { + return this.Context.Parameters.First(it => it.ParameterName == Regex.Match(result, regex).Groups[1].Value).Value; + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubHaving.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubHaving.cs new file mode 100644 index 000000000..9a7811650 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubHaving.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Text.RegularExpressions; + +namespace SqlSugar +{ + public class SubHaving : ISubOperation + { + public bool HasWhere + { + get; set; + } + + public string Name + { + get { return "Having"; } + } + + public Expression Expression + { + get; set; + } + + public int Sort + { + get + { + return 480; + } + } + + public ExpressionContext Context + { + get; set; + } + + public string GetValue(Expression expression) + { + var exp = expression as MethodCallExpression; + var argExp = exp.Arguments[0]; + var result = "Having " + SubTools.GetMethodValue(Context, argExp, ResolveExpressType.WhereMultiple); + var selfParameterName = Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; + if (this.Context.JoinIndex == 0) + result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); + return result; + } + } +} diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs index 7e26b7445..0a231acf7 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs @@ -55,8 +55,19 @@ namespace SqlSugar } if (Regex.IsMatch(result, regex)) { - result = "WHERE " + this.Context.Parameters.First(it => it.ParameterName == Regex.Match(result, regex).Groups[1].Value).Value; - return result; + var value = GetValue(result, regex); + if (value is Expression) + { + var p = this.Context.Parameters.First(it => it.ParameterName == Regex.Match(result, regex).Groups[1].Value); + result = "WHERE " + SubTools.GetMethodValue(Context, value as Expression, ResolveExpressType.WhereMultiple); + argExp = value as Expression; + this.Context.Parameters.Remove(p); + } + else + { + result = "WHERE " + value; + return result; + } } var selfParameterName = Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; @@ -64,5 +75,10 @@ namespace SqlSugar result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); return result; } + + private object GetValue(string result, string regex) + { + return this.Context.Parameters.First(it => it.ParameterName == Regex.Match(result, regex).Groups[1].Value).Value; + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs index a52a3c18f..273b34098 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs @@ -32,7 +32,8 @@ namespace SqlSugar new SubOrderBy(){ Context=Context }, new SubOrderByDesc(){ Context=Context }, new SubGroupBy(){ Context=Context}, - new SubAs(){Context=Context} + new SubAs(){Context=Context}, + new SubHaving(){ Context=Context} }; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs index c570916b4..d873b1d39 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs @@ -27,10 +27,18 @@ namespace SqlSugar { return this; } + public Subqueryable Where(Expression exp) + { + return this; + } public Subqueryable Where(Func expression) { return this; } + public Subqueryable Having(Func expression) + { + return this; + } public Subqueryable Where(Func expression) { return this; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs index 172e981ed..71b1cc25e 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs @@ -408,7 +408,7 @@ namespace SqlSugar { var key = typeName + "." + name; var info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower() == key.ToLower()); - if (mappingKeys.ContainsKey(item.Name)) + if (mappingKeys!=null&&mappingKeys.ContainsKey(item.Name)) { key = mappingKeys[item.Name]+"."+typeName + "." + name; info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower() == key.ToLower()); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbBind/DmDbBind.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbBind/DmDbBind.cs index cb4448c53..eb312805b 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbBind/DmDbBind.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbBind/DmDbBind.cs @@ -83,6 +83,7 @@ namespace SqlSugar new KeyValuePair("int",CSharpDataType.@int), new KeyValuePair("bigint",CSharpDataType.@long), new KeyValuePair("tinyint",CSharpDataType.@short), + new KeyValuePair("smallint",CSharpDataType.@short), new KeyValuePair("integer",CSharpDataType.@int), new KeyValuePair("interval year to month",CSharpDataType.@int), new KeyValuePair("interval day to second",CSharpDataType.@int), diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlBlukCopy.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlBlukCopy.cs index 674668b62..c174f1f0f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlBlukCopy.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlBlukCopy.cs @@ -25,13 +25,13 @@ namespace SqlSugar this.Builder = builder; this.Entitys = entitys; } - public bool ExecuteBlukCopy(string characterSet) + public bool ExecuteBulkCopy(string characterSet) { this.Chara = characterSet; - return ExecuteBlukCopy(); + return ExecuteBulkCopy(); } - public bool ExecuteBlukCopy() + public bool ExecuteBulkCopy() { var IsBulkLoad = false; if (Entitys == null || Entitys.Length <= 0) @@ -42,6 +42,10 @@ namespace SqlSugar Type type = typeof(T); var entity = this.Context.EntityMaintenance.GetEntityInfo(); dt.TableName = this.Builder.GetTranslationColumnName(entity.DbTableName); + if (this.Context.MappingTables != null && this.Context.MappingTables.Any(it => it.EntityName == it.EntityName)) + { + dt.TableName = this.Builder.GetTranslationColumnName(this.Context.MappingTables.First(it => it.EntityName == it.EntityName).DbTableName); + } //创建属性的集合 List pList = new List(); //把所有的public属性加入到集合 并添加DataTable的列 @@ -111,15 +115,15 @@ namespace SqlSugar return IsBulkLoad; ; } - public Task ExecuteBlukCopyAsync() + public Task ExecuteBulkCopyAsync() { - return Task.FromResult(ExecuteBlukCopy()); + return Task.FromResult(ExecuteBulkCopy()); } - public Task ExecuteBlukCopyAsync(string characterSet) + public Task ExecuteBulkCopyAsync(string characterSet) { this.Chara = characterSet; - return Task.FromResult(ExecuteBlukCopy()); + return Task.FromResult(ExecuteBulkCopy()); } #region Helper diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlQueryBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlQueryBuilder.cs index 53a7532ca..3728e960c 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlQueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlQueryBuilder.cs @@ -66,7 +66,7 @@ namespace SqlSugar } private string ToCountSqlString() { - base.AppendFilter(); + //base.AppendFilter(); string oldOrderValue = this.OrderByValue; string result = null; sql = new StringBuilder(); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLExpressionContext.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLExpressionContext.cs index 1a31dd6f5..0e8caf4a8 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLExpressionContext.cs @@ -101,6 +101,35 @@ namespace SqlSugar return propertyName.ToLower(isAutoToLower); } } + + public string GetValue(object entityValue) + { + if (entityValue == null) + return null; + var type = UtilMethods.GetUnderType(entityValue.GetType()); + if (UtilConstants.NumericalTypes.Contains(type)) + { + return entityValue.ToString(); + } + else if (type == UtilConstants.DateType) + { + return this.DbMehtods.ToDate(new MethodCallExpressionModel() + { + Args = new System.Collections.Generic.List() { + new MethodCallExpressionArgs(){ MemberName=$"'{entityValue}'" } + } + }); + } + else + { + return this.DbMehtods.ToString(new MethodCallExpressionModel() + { + Args = new System.Collections.Generic.List() { + new MethodCallExpressionArgs(){ MemberName=$"'{entityValue}'" } + } + }); + } + } } public class PostgreSQLMethod : DefaultDbMethod, IDbMethods { @@ -140,7 +169,7 @@ namespace SqlSugar } if (parameter2.MemberValue.ObjToString() == DateType.Minute.ToString()) { - format = "mm"; + format = "mi"; } if (parameter2.MemberValue.ObjToString() == DateType.Second.ToString()) { @@ -148,7 +177,7 @@ namespace SqlSugar } if (parameter2.MemberValue.ObjToString() == DateType.Millisecond.ToString()) { - format = "ss"; + format = "ms"; } return string.Format(" cast( to_char({1},'{0}')as integer ) ", format, parameter.MemberName); } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Utilities/ValidateExtensions.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Utilities/ValidateExtensions.cs index df518b73f..8ae5209a0 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Utilities/ValidateExtensions.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Utilities/ValidateExtensions.cs @@ -166,7 +166,7 @@ namespace SqlSugar public static bool IsClass(this Type thisValue) { - return thisValue != StringType && thisValue.IsEntity(); + return thisValue != StringType && thisValue.IsEntity()&&thisValue!=UtilConstants.ByteArrayType; } } }