diff --git a/SqlServerTest/Program.cs b/SqlServerTest/Program.cs index 114e595ba..c13d548c4 100644 --- a/SqlServerTest/Program.cs +++ b/SqlServerTest/Program.cs @@ -20,7 +20,7 @@ namespace OrmTest /***Unit Test***/ //new Field(1).Init(); //new Where(1).Init(); - //new Method(1).Init(); + new Method(1).Init(); //new JoinQuery(1).Init(); //new SingleQuery(1).Init(); //new SelectQuery(1).Init(); @@ -34,15 +34,15 @@ namespace OrmTest new SqlSugarPerformance(100).Select(); /***Demo***/ - OrmTest.Demo.Query.Init(); - OrmTest.Demo.Insert.Init(); - OrmTest.Demo.Delete.Init(); - OrmTest.Demo.Update.Init(); - OrmTest.Demo.DbFirst.Init(); - OrmTest.Demo.JoinSql.Init(); - OrmTest.Demo.Filter.Init(); - OrmTest.Demo.MaterSlave.Init(); - OrmTest.Demo.ComplexModel.Init(); + //OrmTest.Demo.Query.Init(); + //OrmTest.Demo.Insert.Init(); + //OrmTest.Demo.Delete.Init(); + //OrmTest.Demo.Update.Init(); + //OrmTest.Demo.DbFirst.Init(); + //OrmTest.Demo.JoinSql.Init(); + //OrmTest.Demo.Filter.Init(); + //OrmTest.Demo.MaterSlave.Init(); + //OrmTest.Demo.ComplexModel.Init(); } } } diff --git a/SqlServerTest/UnitTest/ExpressionTest/Method.cs b/SqlServerTest/UnitTest/ExpressionTest/Method.cs index f20b6790b..70f1fbc99 100644 --- a/SqlServerTest/UnitTest/ExpressionTest/Method.cs +++ b/SqlServerTest/UnitTest/ExpressionTest/Method.cs @@ -21,6 +21,13 @@ namespace OrmTest.UnitTest base.Begin(); for (int i = 0; i < base.Count; i++) { + + //Native methods + ConvetToString(); + ExtendToString(); + ExtendSubstring(); + + //SqlFun methods IIF(); IIF2(); #region StringIsNullOrEmpty @@ -62,6 +69,31 @@ namespace OrmTest.UnitTest base.End("Method Test"); } + private void ExtendToString() + { + Expression> exp = it => it.Id.ToString() == "a"; + SqlServerExpressionContext expContext = new SqlServerExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereSingle); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, "(CAST([Id] AS NVARCHAR(MAX)) = @Const0 )", new List() { + new SugarParameter("@Const0","a") + }, "To_string error"); + } + + private void ConvetToString() + { + Expression> exp = it => Convert.ToString(it.Id) == "a"; + SqlServerExpressionContext expContext = new SqlServerExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereSingle); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, "(CAST([Id] AS NVARCHAR(MAX)) = @Const0 )", new List() { + new SugarParameter("@Const0","a") + }, "To_string error"); + } + + private void Length() { Expression> exp = it => SqlFunc.Length("aaaa") > 1; @@ -99,6 +131,19 @@ namespace OrmTest.UnitTest new SugarParameter("@MethodConst0","aaaa"), new SugarParameter("@MethodConst1",0) , new SugarParameter("@MethodConst2",2),new SugarParameter("@Const3","a") }, "Substring error"); } + private void ExtendSubstring() + { + var x2 = Guid.NewGuid(); + Expression> exp = it =>"aaaa".Substring(0, 2)== "a"; + SqlServerExpressionContext expContext = new SqlServerExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereSingle); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, "(SUBSTRING(@MethodConst0,1 + @MethodConst1,@MethodConst2) = @Const3 )", new List() { + new SugarParameter("@MethodConst0","aaaa"), new SugarParameter("@MethodConst1",0) , new SugarParameter("@MethodConst2",2),new SugarParameter("@Const3","a") + }, "Substring error"); + } + private void ToBool() { diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index fd570f056..a7ac36044 100644 --- a/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -1,6 +1,7 @@ using SqlSugar; using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Linq.Expressions; using System.Text; @@ -12,10 +13,29 @@ namespace SqlSugar { var express = base.Expression as MethodCallExpression; var isLeft = parameter.IsLeft; + var isValidNativeMethod = + express.Method.Name.IsIn( + "ToString", "ToInt32", "ToInt64", + "Length", "Replace", "Substring", + "Contains", "EndsWith", "StartsWith", + "HasValue", "Trim", "Equals", + "ToLower", "ToUpper"); + if (isValidNativeMethod) + { + NativeExtensionMethod(parameter, express, isLeft); + } + else + { + SqlFuncMethod(parameter, express, isLeft); + } + } + + private void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft) + { CheckMethod(express); var method = express.Method; string name = method.Name; - var args = express.Arguments; + var args = express.Arguments.Cast().ToList(); MethodCallExpressionModel model = new MethodCallExpressionModel(); model.Args = new List(); switch (this.Context.ResolveType) @@ -35,7 +55,37 @@ namespace SqlSugar break; } } - private void Select(ExpressionParameter parameter, bool? isLeft, string name, System.Collections.ObjectModel.ReadOnlyCollection args, MethodCallExpressionModel model) + + private void NativeExtensionMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft) + { + 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: + if (express.Object != null) + args.Insert(0,express.Object); + Where(parameter, isLeft, name, args, model); + break; + case ResolveExpressType.SelectSingle: + case ResolveExpressType.SelectMultiple: + case ResolveExpressType.Update: + if (express.Object != null) + args.Insert(0, express.Object); + Select(parameter, isLeft, name, args, model); + break; + case ResolveExpressType.FieldSingle: + case ResolveExpressType.FieldMultiple: + default: + break; + } + } + + private void Select(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable args, MethodCallExpressionModel model) { foreach (var item in args) { @@ -51,11 +101,11 @@ namespace SqlSugar } parameter.BaseParameter.CommonTempData = GetMdthodValue(name, model); } - private void Where(ExpressionParameter parameter, bool? isLeft, string name, System.Collections.ObjectModel.ReadOnlyCollection args, MethodCallExpressionModel model) + private void Where(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable args, MethodCallExpressionModel model) { foreach (var item in args) { - var isBinaryExpression = item is BinaryExpression||item is MethodCallExpression; + var isBinaryExpression = item is BinaryExpression || item is MethodCallExpression; if (isBinaryExpression) { model.Args.Add(GetMethodCallArgs(parameter, item));