From c7d6bbabb5086358a17b0400c26a65674c86054c Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Tue, 28 Nov 2017 13:06:57 +0800 Subject: [PATCH] - --- .../UnitTest/ExpressionTest/Where.cs | 16 ++++ .../MethodCallExpressionResolve.cs | 77 +++++++++++++------ 2 files changed, 68 insertions(+), 25 deletions(-) diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/ExpressionTest/Where.cs b/Src/Asp.Net/SqlServerTest/UnitTest/ExpressionTest/Where.cs index 1e6dcd4d9..4e3165b0f 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/ExpressionTest/Where.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/ExpressionTest/Where.cs @@ -21,6 +21,7 @@ namespace OrmTest.UnitTest base.Begin(); for (int i = 0; i < base.Count; i++) { + whereSingle28(); whereSingle27(); whereSingle26(); whereSingle25(); @@ -55,6 +56,21 @@ namespace OrmTest.UnitTest } base.End("Where Test"); } + public string Get28(string a) { + return a + "1"; + } + private void whereSingle28() + { + Expression> exp = it => Get28("22")=="22"; + ExpressionContext expContext = new ExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereMultiple); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, " (@constant0 = @Const1 )", new List() { + new SugarParameter("@constant0","221"), + new SugarParameter("@Const1","22") + }, "whereSingle28"); + } private void whereSingle27() { var schoolData = new School() { Id = 100, Name = "x" }; Expression> exp = it => it.Name.Contains(schoolData.Name); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index d343ce2d9..1fe6b24b7 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -105,34 +105,61 @@ namespace SqlSugar private void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft) { - if (!CheckMethod(express)) { - Check.Exception(true, string.Format(ErrorMessage.MethodError, express.Method.Name)); - } - var method = express.Method; - string name = method.Name; - var args = express.Arguments.Cast().ToList(); - MethodCallExpressionModel model = new MethodCallExpressionModel(); - model.Args = new List(); - switch (this.Context.ResolveType) + if (!CheckMethod(express)) { - case ResolveExpressType.WhereSingle: - case ResolveExpressType.WhereMultiple: - Check.Exception(name == "GetSelfAndAutoFill", "SqlFunc.GetSelfAndAutoFill can only be used in Select."); - Where(parameter, isLeft, name, args, model); - break; - case ResolveExpressType.SelectSingle: - case ResolveExpressType.SelectMultiple: - case ResolveExpressType.Update: - Select(parameter, isLeft, name, args, model); - break; - case ResolveExpressType.FieldSingle: - case ResolveExpressType.FieldMultiple: - Field(parameter, isLeft, name, args, model); - break; - default: - break; + CusMethod(parameter, express, isLeft); + } + else + { + var method = express.Method; + string name = method.Name; + var args = express.Arguments.Cast().ToList(); + MethodCallExpressionModel model = new MethodCallExpressionModel(); + model.Args = new List(); + switch (this.Context.ResolveType) + { + case ResolveExpressType.WhereSingle: + case ResolveExpressType.WhereMultiple: + Check.Exception(name == "GetSelfAndAutoFill", "SqlFunc.GetSelfAndAutoFill can only be used in Select."); + Where(parameter, isLeft, name, args, model); + break; + case ResolveExpressType.SelectSingle: + case ResolveExpressType.SelectMultiple: + case ResolveExpressType.Update: + Select(parameter, isLeft, name, args, model); + break; + case ResolveExpressType.FieldSingle: + case ResolveExpressType.FieldMultiple: + Field(parameter, isLeft, name, args, model); + break; + default: + break; + } } } + + private void CusMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft) + { + try + { + var constValue = ExpressionTool.DynamicInvoke(express); + parameter.BaseParameter.CommonTempData = constValue; + var parameterName = base.AppendParameter(constValue); + if (parameter.BaseParameter.CommonTempData != null && parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Result)) + { + this.Context.Result.Append(parameterName); + } + else + { + base.AppendValue(parameter, isLeft, parameterName); + } + } + catch + { + Check.Exception(true, string.Format(ErrorMessage.MethodError, express.Method.Name)); + } + } + private void NativeExtensionMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft, string name, List appendArgs = null) { var method = express.Method;