Support native methods

This commit is contained in:
sunkaixuan
2017-06-14 00:20:41 +08:00
parent 29efa042e4
commit faa1940203
3 changed files with 109 additions and 14 deletions

View File

@@ -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();
}
}
}

View File

@@ -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<Func<Student, bool>> 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<SugarParameter>() {
new SugarParameter("@Const0","a")
}, "To_string error");
}
private void ConvetToString()
{
Expression<Func<Student, bool>> 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<SugarParameter>() {
new SugarParameter("@Const0","a")
}, "To_string error");
}
private void Length()
{
Expression<Func<Student, bool>> 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<Func<Student, bool>> 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<SugarParameter>() {
new SugarParameter("@MethodConst0","aaaa"), new SugarParameter("@MethodConst1",0) , new SugarParameter("@MethodConst2",2),new SugarParameter("@Const3","a")
}, "Substring error");
}
private void ToBool()
{

View File

@@ -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<Expression>().ToList();
MethodCallExpressionModel model = new MethodCallExpressionModel();
model.Args = new List<MethodCallExpressionArgs>();
switch (this.Context.ResolveType)
@@ -35,7 +55,37 @@ namespace SqlSugar
break;
}
}
private void Select(ExpressionParameter parameter, bool? isLeft, string name, System.Collections.ObjectModel.ReadOnlyCollection<Expression> 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<Expression>().ToList();
MethodCallExpressionModel model = new MethodCallExpressionModel();
model.Args = new List<MethodCallExpressionArgs>();
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<Expression> 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<Expression> args, MethodCallExpressionModel model)
private void Where(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> 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));