From ccb4622202ba4f2b18224495bc6d884b1f836e8d Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Tue, 1 Jan 2019 21:17:51 +0800 Subject: [PATCH] UpdateColumns BUG --- Src/Asp.Net/SqlServerTest/Demos/2_Update.cs | 9 +++++ .../ResolveItems/BaseResolve.cs | 33 ++++++++++++++++++ .../MemberInitExpressionResolve.cs | 26 +++++++++++++- .../MethodCallExpressionResolve.cs | 34 ------------------- 4 files changed, 67 insertions(+), 35 deletions(-) diff --git a/Src/Asp.Net/SqlServerTest/Demos/2_Update.cs b/Src/Asp.Net/SqlServerTest/Demos/2_Update.cs index a7c259ee8..043ca559d 100644 --- a/Src/Asp.Net/SqlServerTest/Demos/2_Update.cs +++ b/Src/Asp.Net/SqlServerTest/Demos/2_Update.cs @@ -119,6 +119,15 @@ namespace OrmTest.Demo var t25 = db.Updateable(new Student() { }).UpdateColumns(it=> new { it.Name,it.CreateTime}).WhereColumns(it => it.CreateTime).ExecuteCommand(); var t26 = db.Updateable(new List() { new Student() { }, new Student() { } }).UpdateColumns(it => new { it.Name, it.CreateTime }).WhereColumns(it => it.CreateTime).ExecuteCommand(); + + + db.Updateable().UpdateColumns(it => new Student { SchoolId = GeneratePassword(2, 1), Name =it.Name+1, CreateTime = DateTime.Now.AddDays(1) }).Where(it => it.Id == 1).ExecuteCommand(); + } + + private static int GeneratePassword(int v1, int v2) + { + return 1; } } + } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs index f4849ae58..19a3e547b 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs @@ -445,5 +445,38 @@ namespace SqlSugar Check.ThrowNotSupportedException(item.GetType().Name); } } + protected static Dictionary MethodMapping = new Dictionary() { + { "ToString","ToString"}, + { "ToInt32","ToInt32"}, + { "ToInt16","ToInt32"}, + { "ToInt64","ToInt64"}, + { "ToDecimal","ToDecimal"}, + { "ToDateTime","ToDate"}, + { "ToBoolean","ToBool"}, + { "ToDouble","ToDouble"}, + { "Length","Length"}, + { "Replace","Replace"}, + { "Contains","Contains"}, + { "ContainsArray","ContainsArray"}, + { "EndsWith","EndsWith"}, + { "StartsWith","StartsWith"}, + { "HasValue","HasValue"}, + { "Trim","Trim"}, + { "Equals","Equals"}, + { "ToLower","ToLower"}, + { "ToUpper","ToUpper"}, + { "Substring","Substring"}, + { "DateAdd","DateAdd"} + }; + + protected static Dictionary MethodTimeMapping = new Dictionary() { + { "AddYears",DateType.Year}, + { "AddMonths",DateType.Month}, + { "AddDays",DateType.Day}, + { "AddHours",DateType.Hour}, + { "AddMinutes",DateType.Minute}, + { "AddSeconds",DateType.Second}, + { "AddMilliseconds",DateType.Millisecond} + }; } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs index 333410016..2bcce18a8 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs @@ -61,7 +61,17 @@ namespace SqlSugar { if (item is UnaryExpression) item = (item as UnaryExpression).Operand; - MethodCall(parameter, memberName, item); + var callMethod = item as MethodCallExpression; + if (MethodTimeMapping.Any(it => it.Key == callMethod.Method.Name) || MethodMapping.Any(it=>it.Key==callMethod.Method.Name)||IsExtMethod(callMethod.Method.Name)||IsSubMethod(callMethod)|| callMethod.Method.DeclaringType.FullName.StartsWith(UtilConstants.AssemblyName+UtilConstants.Dot)) + { + MethodCall(parameter, memberName, item); + } + else + { + var paramterValue = ExpressionTool.DynamicInvoke(item); + string parameterName = AppendParameter(paramterValue); + this.Context.Result.Append(base.Context.GetEqString(memberName, parameterName)); + } } else if (IsConst(item)) { @@ -147,5 +157,19 @@ namespace SqlSugar { return SubTools.SubItemsConst.Any(it =>express.Object != null && express.Object.Type.Name == "Subqueryable`1"); } + private bool IsExtMethod(string methodName) + { + if (this.Context.SqlFuncServices == null) return false; + return this.Context.SqlFuncServices.Select(it => it.UniqueMethodName).Contains(methodName); + } + private bool CheckMethod(MethodCallExpression expression) + { + if (IsExtMethod(expression.Method.Name)) + return true; + if (expression.Method.ReflectedType().FullName != ExpressionConst.SqlFuncFullName) + return false; + else + return true; + } } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index 9248880f7..289a573fa 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -513,40 +513,6 @@ namespace SqlSugar return null; } - private static Dictionary MethodMapping = new Dictionary() { - { "ToString","ToString"}, - { "ToInt32","ToInt32"}, - { "ToInt16","ToInt32"}, - { "ToInt64","ToInt64"}, - { "ToDecimal","ToDecimal"}, - { "ToDateTime","ToDate"}, - { "ToBoolean","ToBool"}, - { "ToDouble","ToDouble"}, - { "Length","Length"}, - { "Replace","Replace"}, - { "Contains","Contains"}, - { "ContainsArray","ContainsArray"}, - { "EndsWith","EndsWith"}, - { "StartsWith","StartsWith"}, - { "HasValue","HasValue"}, - { "Trim","Trim"}, - { "Equals","Equals"}, - { "ToLower","ToLower"}, - { "ToUpper","ToUpper"}, - { "Substring","Substring"}, - { "DateAdd","DateAdd"} - }; - - private static Dictionary MethodTimeMapping = new Dictionary() { - { "AddYears",DateType.Year}, - { "AddMonths",DateType.Month}, - { "AddDays",DateType.Day}, - { "AddHours",DateType.Hour}, - { "AddMinutes",DateType.Minute}, - { "AddSeconds",DateType.Second}, - { "AddMilliseconds",DateType.Millisecond} - }; - private bool IsContainsArray(MethodCallExpression express, string methodName, bool isValidNativeMethod) { return !isValidNativeMethod && express.Method.DeclaringType.Namespace.IsIn("System.Linq", "System.Collections.Generic") && methodName == "Contains";