Merge branch 'dev' of github.com:sunkaixuan/SqlSugar

This commit is contained in:
sunkaixuan 2017-06-14 16:30:44 +08:00
commit 758fef4be6
5 changed files with 157 additions and 23 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,15 @@ namespace OrmTest.UnitTest
base.Begin();
for (int i = 0; i < base.Count; i++)
{
//Native methods
ExtendContainsArray();
ConvetToString();
ExtendToString();
ExtendSubstring();
ExtendDate();
//SqlFun methods
IIF();
IIF2();
#region StringIsNullOrEmpty
@ -62,6 +71,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")
}, "ExtendToString 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")
}, "ConvetToString error");
}
private void Length()
{
Expression<Func<Student, bool>> exp = it => SqlFunc.Length("aaaa") > 1;
@ -99,6 +133,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()
{
@ -177,7 +224,19 @@ namespace OrmTest.UnitTest
new SugarParameter("@MethodConst0","2015-1-1"),new SugarParameter("@Const1",x2)
}, "ToDate error");
}
private void ExtendDate()
{
var x2 = DateTime.Now;
Expression<Func<Student, bool>> exp = it => Convert.ToDateTime("2015-1-1") == x2;
SqlServerExpressionContext expContext = new SqlServerExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereSingle);
var value = expContext.Result.GetString();
var pars = expContext.Parameters;
base.Check(value, pars, "(CAST(@MethodConst0 AS DATETIME) = @Const1 )", new List<SugarParameter>() {
new SugarParameter("@MethodConst0","2015-1-1"),new SugarParameter("@Const1",x2)
}, "ExtendDate error");
}
private void ToInt64()
{
var x2 = DateTime.Now;
@ -358,6 +417,16 @@ namespace OrmTest.UnitTest
}, "Contains error");
}
private void ExtendContainsArray() {
string[] array = new string[] { "1", "2" };
Expression<Func<Student, bool>> exp = it => array.Contains(it.Name);
SqlServerExpressionContext expContext = new SqlServerExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereSingle);
var value = expContext.Result.GetString();
var pars = expContext.Parameters;
base.Check(value, null, " ([Name] IN ('1','2')) ", null, "Contains2 error");
}
private void ContainsArray()
{
string[] array = new string[] { "1", "2" };

View File

@ -36,11 +36,5 @@ namespace SqlSugar
throw new SqlSugarException(string.Format(message, args));
}
internal static void Exception(bool v, object xX)
{
throw new NotImplementedException();
}
}
}

View File

@ -26,7 +26,7 @@ namespace SqlSugar
{
get
{
return ExpressionConst.GetThrowMessage("Please use the following methods in the SqlFunc class, such as SqlFunc.IsNullOrEmpty (it.Name) for Lambda parsing", "拉姆达解析请使用 SqlFunc 类下面的方法,例如 SqlFunc.IsNullOrEmpty(it.Name)");
return ExpressionConst.GetThrowMessage("Expression parsing does not support the current function {0}. There are many functions available in the SqlFunc class, for example, it=>SqlFunc.HasValue(it.Id)", "拉姆达解析不支持当前函数{0}SqlFunc这个类里面有大量函数可用,也许有你想要的,例如: it=>SqlFunc.HasValue(it.Id)");
}
}
}

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,28 @@ namespace SqlSugar
{
var express = base.Expression as MethodCallExpression;
var isLeft = parameter.IsLeft;
string methodName = express.Method.Name;
var isValidNativeMethod = MethodMapping.ContainsKey(methodName)&&express.Method.DeclaringType.Namespace==("System");
if (!isValidNativeMethod&&express.Method.DeclaringType.Namespace== "System.Linq"&&methodName=="Contains") {
methodName = "ContainsArray";
isValidNativeMethod = true;
}
if (isValidNativeMethod)
{
NativeExtensionMethod(parameter, express, isLeft, MethodMapping[methodName]);
}
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 +54,36 @@ 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,string name)
{
var method = express.Method;
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 +99,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));
@ -184,9 +232,32 @@ namespace SqlSugar
return null;
}
private static Dictionary<string, string> MethodMapping = new Dictionary<string, string>() {
{ "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"}
};
private void CheckMethod(MethodCallExpression expression)
{
Check.Exception(expression.Method.ReflectedType.FullName != ExpressionConst.SqlFuncFullName, ExpressionErrorMessage.MethodError);
Check.Exception(expression.Method.ReflectedType.FullName != ExpressionConst.SqlFuncFullName,string.Format(ExpressionErrorMessage.MethodError, expression.Method.Name));
}
}
}