From f4f42f05c44908a14005d7d742dc9b09b80d836d Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Fri, 3 Mar 2023 23:51:22 +0800 Subject: [PATCH] Update custom convert --- .../SqlBuilderProvider/InsertBuilder.cs | 2 +- .../SqlBuilderProvider/UpdateBuilder.cs | 2 +- .../SqlSugar/Entities/DefaultCustom.cs | 14 ++++- .../ResolveItems/BaseResolve_Append.cs | 7 +++ .../ResolveItems/BinaryExpressionResolve.cs | 5 ++ .../ResolveItems/ConstantExpressionResolve.cs | 56 +++++++++++++++++++ 6 files changed, 81 insertions(+), 5 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs index edb10f787..a77a5a3d1 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs @@ -287,7 +287,7 @@ namespace SqlSugar else if (columnInfo.SqlParameterDbType is Type) { var type=columnInfo.SqlParameterDbType as Type; - var ParameterConverter=type.GetMethod("ParameterConverter"); + var ParameterConverter=type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyType); //var obj=Activator.CreateInstance(type); var p = ParameterConverter.Invoke(null,new object[] {columnInfo.Value, GetDbColumnIndex }) as SugarParameter; GetDbColumnIndex++; diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index 3b06917bb..75812e6bd 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs @@ -404,7 +404,7 @@ namespace SqlSugar else if (columnInfo.SqlParameterDbType is Type) { var type = columnInfo.SqlParameterDbType as Type; - var ParameterConverter = type.GetMethod("ParameterConverter"); + var ParameterConverter = type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyType); //var obj = Activator.CreateInstance(type); var p = ParameterConverter.Invoke(null,new object[] { columnInfo.Value, GetDbColumnIndex }) as SugarParameter; GetDbColumnIndex++; diff --git a/Src/Asp.Net/SqlSugar/Entities/DefaultCustom.cs b/Src/Asp.Net/SqlSugar/Entities/DefaultCustom.cs index 03d21ba90..2510de28b 100644 --- a/Src/Asp.Net/SqlSugar/Entities/DefaultCustom.cs +++ b/Src/Asp.Net/SqlSugar/Entities/DefaultCustom.cs @@ -9,11 +9,19 @@ namespace SqlSugar.DbConvert { public static class EnumToStringConvert { - public static SugarParameter ParameterConverter(object value, int i) + public static SugarParameter ParameterConverter(object value, int i) { var name = "@myenmu" + i; - var enumToString = value?.ToString(); - return new SugarParameter(name, enumToString); + Type undertype = SqlSugar.UtilMethods.GetUnderType(typeof(T));//获取没有nullable的枚举类型 + if (value == null) + { + return new SugarParameter(name, null); + } + else + { + var enumObjString = Enum.Parse(undertype, value + "").ToString(); + return new SugarParameter(name, enumObjString); + } } public static T QueryConverter(this IDataRecord dr, int i) diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve_Append.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve_Append.cs index 610161f1a..b98608cea 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve_Append.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve_Append.cs @@ -216,6 +216,13 @@ namespace SqlSugar this.Context.Parameters.Add(new SugarParameter(parameterName, paramterValue)); return parameterName; } + protected string AppendParameter(SugarParameter p) + { + p.ParameterName= p.ParameterName + this.Context.ParameterIndex; + this.Context.ParameterIndex++; ; + this.Context.Parameters.Add(p); + return p.ParameterName; + } protected void AppendNot(object Value) { var isAppend = !this.Context.Result.Contains(ExpressionConst.FormatSymbol); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BinaryExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BinaryExpressionResolve.cs index e63f19331..a0bd2efde 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BinaryExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BinaryExpressionResolve.cs @@ -131,6 +131,11 @@ namespace SqlSugar base.ExactExpression = expression; var leftExpression = expression.Left; var rightExpression = expression.Right; + if (operatorValue == "="&& ExpressionTool.RemoveConvert(leftExpression) is ConstantExpression) + { + leftExpression = expression.Right; + rightExpression = expression.Left; + } if (RightIsHasValue(leftExpression, rightExpression,ExpressionTool.IsLogicOperator(expression))) { Expression trueValue = Expression.Constant(true); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs index 53277fb0e..8a18620f0 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs @@ -11,6 +11,62 @@ namespace SqlSugar public ConstantExpressionResolve(ExpressionParameter parameter) : base(parameter) { var expression = base.Expression as ConstantExpression; + string customParameter = GetCustomParameter(parameter, expression); + if (customParameter == null) + { + DefaultConstant(parameter, expression); + } + else + { + CustomConstant(parameter, customParameter); + } + } + + private void CustomConstant(ExpressionParameter parameter, string customParameter) + { + var baseParameter = parameter.BaseParameter; + var isSetTempData = baseParameter.CommonTempData.HasValue() && baseParameter.CommonTempData.Equals(CommonTempDataType.Result); + if (isSetTempData) + { + baseParameter.CommonTempData = customParameter; + } + else + { + AppendMember(parameter, parameter.IsLeft, customParameter); + } + } + + private string GetCustomParameter(ExpressionParameter parameter, ConstantExpression expression) + { + string customParameter = null; + if (parameter.OppsiteExpression != null) + { + var exp = ExpressionTool.RemoveConvert(parameter.OppsiteExpression); + if (exp is MemberExpression) + { + var member = (exp as MemberExpression); + var memberParent = member.Expression; + if (memberParent != null) + { + var entity = this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(memberParent.Type); + var columnInfo = entity.Columns.FirstOrDefault(it => it.PropertyName == member.Member.Name); + if (columnInfo.SqlParameterDbType is Type) + { + var type = columnInfo.SqlParameterDbType as Type; + var ParameterConverter = type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyInfo.PropertyType); + //var obj=Activator.CreateInstance(type); + var p = ParameterConverter.Invoke(null, new object[] { expression.Value, 100 }) as SugarParameter; + customParameter = base.AppendParameter(p); + + } + } + } + } + return customParameter; + } + + private void DefaultConstant(ExpressionParameter parameter, ConstantExpression expression) + { var isLeft = parameter.IsLeft; object value = ExpressionTool.GetValue(expression.Value, this.Context); value = ConvetValue(parameter, expression, value);