Support System.Date.addXXX

This commit is contained in:
sunkaixuan
2017-07-16 04:35:42 +08:00
parent ea735bceb5
commit 1eae6282c0
2 changed files with 78 additions and 14 deletions

View File

@@ -352,7 +352,38 @@ namespace OrmTest.UnitTest
var pars = expContext.Parameters; var pars = expContext.Parameters;
base.Check(value, pars, "((DATEADD(day,@MethodConst1,@MethodConst0)) = @Const2 )", new List<SugarParameter>() { base.Check(value, pars, "((DATEADD(day,@MethodConst1,@MethodConst0)) = @Const2 )", new List<SugarParameter>() {
new SugarParameter("@MethodConst0",x2),new SugarParameter("@MethodConst1",1),new SugarParameter("@Const2",x2) new SugarParameter("@MethodConst0",x2),new SugarParameter("@MethodConst1",1),new SugarParameter("@Const2",x2)
}, "DateIsSameByType error"); }, "DateAddDay error");
DateAddDay2();
DateAddDay3();
}
private void DateAddDay2()
{
var x2 = DateTime.Now;
Expression<Func<DataTestInfo, bool>> exp = it =>it.Datetime2.Value.AddHours(10) == x2;
SqlServerExpressionContext expContext = new SqlServerExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereSingle);
var value = expContext.Result.GetString();
var pars = expContext.Parameters;
base.Check(value, pars, "((DATEADD(@Const0,@MethodConst1,[Datetime2])) = @Const2 )", new List<SugarParameter>() {
new SugarParameter("@Const0",DateType.Hour.ToString()),new SugarParameter("@MethodConst1",10)
,new SugarParameter("@Const2",x2)
}, "DateAddDay2 error");
}
private void DateAddDay3()
{
var x2 = DateTime.Now;
Expression<Func<Student, bool>> exp = it => x2.AddHours(1) == x2;
SqlServerExpressionContext expContext = new SqlServerExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereSingle);
var value = expContext.Result.GetString();
var pars = expContext.Parameters;
base.Check(value, pars, "((DATEADD(@Const0,@MethodConst2,@MethodConst1)) = @Const3 )", new List<SugarParameter>() {
new SugarParameter("@Const0",DateType.Hour.ToString()),new SugarParameter("@MethodConst2",1),new SugarParameter("@MethodConst1",x2)
,new SugarParameter("@Const3",x2)
}, "DateAddDay3 error");
} }
private void DateIsSameByType() private void DateIsSameByType()

View File

@@ -14,7 +14,20 @@ namespace SqlSugar
var express = base.Expression as MethodCallExpression; var express = base.Expression as MethodCallExpression;
var isLeft = parameter.IsLeft; var isLeft = parameter.IsLeft;
string methodName = express.Method.Name; string methodName = express.Method.Name;
if (methodName == "get_Item") var isValidNativeMethod = MethodMapping.ContainsKey(methodName) && express.Method.DeclaringType.Namespace == ("System");
List<MethodCallExpressionArgs> appendArgs = null;
if (MethodTimeMapping.ContainsKey(methodName))
{
appendArgs = new List<MethodCallExpressionArgs>();
var dateType = MethodTimeMapping[methodName];
string paramterName = this.Context.SqlParameterKeyWord + ExpressionConst.Const + this.Context.ParameterIndex;
appendArgs.Add(new MethodCallExpressionArgs() { IsMember=false, MemberName= paramterName, MemberValue=dateType });
this.Context.Parameters.Add(new SugarParameter(paramterName, dateType.ToString()));
this.Context.ParameterIndex++;
methodName = "DateAdd";
isValidNativeMethod = true;
}
else if (methodName == "get_Item")
{ {
string paramterName = this.Context.SqlParameterKeyWord + ExpressionConst.Const + this.Context.ParameterIndex; string paramterName = this.Context.SqlParameterKeyWord + ExpressionConst.Const + this.Context.ParameterIndex;
this.Context.Parameters.Add(new SugarParameter(paramterName, ExpressionTool.DynamicInvoke(express))); this.Context.Parameters.Add(new SugarParameter(paramterName, ExpressionTool.DynamicInvoke(express)));
@@ -22,18 +35,19 @@ namespace SqlSugar
this.Context.ParameterIndex++; this.Context.ParameterIndex++;
return; return;
} }
else if (methodName == "NewGuid") { else if (methodName == "NewGuid")
{
this.Context.Result.Append(this.Context.DbMehtods.GuidNew()); this.Context.Result.Append(this.Context.DbMehtods.GuidNew());
return; return;
} }
var isValidNativeMethod = MethodMapping.ContainsKey(methodName)&&express.Method.DeclaringType.Namespace==("System"); if (!isValidNativeMethod && express.Method.DeclaringType.Namespace.IsIn("System.Linq", "System.Collections.Generic") && methodName == "Contains")
if (!isValidNativeMethod&&express.Method.DeclaringType.Namespace.IsIn("System.Linq", "System.Collections.Generic")&&methodName=="Contains") { {
methodName = "ContainsArray"; methodName = "ContainsArray";
isValidNativeMethod = true; isValidNativeMethod = true;
} }
if (isValidNativeMethod) if (isValidNativeMethod)
{ {
NativeExtensionMethod(parameter, express, isLeft, MethodMapping[methodName]); NativeExtensionMethod(parameter, express, isLeft, MethodMapping[methodName],appendArgs);
} }
else else
{ {
@@ -67,7 +81,7 @@ namespace SqlSugar
} }
} }
private void NativeExtensionMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft,string name) private void NativeExtensionMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft, string name, List<MethodCallExpressionArgs> appendArgs = null)
{ {
var method = express.Method; var method = express.Method;
var args = express.Arguments.Cast<Expression>().ToList(); var args = express.Arguments.Cast<Expression>().ToList();
@@ -79,14 +93,14 @@ namespace SqlSugar
case ResolveExpressType.WhereMultiple: case ResolveExpressType.WhereMultiple:
if (express.Object != null) if (express.Object != null)
args.Insert(0, express.Object); args.Insert(0, express.Object);
Where(parameter, isLeft, name, args, model); Where(parameter, isLeft, name, args, model, appendArgs);
break; break;
case ResolveExpressType.SelectSingle: case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple: case ResolveExpressType.SelectMultiple:
case ResolveExpressType.Update: case ResolveExpressType.Update:
if (express.Object != null) if (express.Object != null)
args.Insert(0, express.Object); args.Insert(0, express.Object);
Select(parameter, isLeft, name, args, model); Select(parameter, isLeft, name, args, model, appendArgs);
break; break;
case ResolveExpressType.FieldSingle: case ResolveExpressType.FieldSingle:
case ResolveExpressType.FieldMultiple: case ResolveExpressType.FieldMultiple:
@@ -95,7 +109,7 @@ namespace SqlSugar
} }
} }
private void Select(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model) private void Select(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model, List<MethodCallExpressionArgs> appendArgs = null)
{ {
foreach (var item in args) foreach (var item in args)
{ {
@@ -109,9 +123,13 @@ namespace SqlSugar
Default(parameter, model, item); Default(parameter, model, item);
} }
} }
if (appendArgs != null)
{
model.Args.AddRange(appendArgs);
}
parameter.BaseParameter.CommonTempData = GetMdthodValue(name, model); parameter.BaseParameter.CommonTempData = GetMdthodValue(name, model);
} }
private void Where(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model) private void Where(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model, List<MethodCallExpressionArgs> appendArgs = null)
{ {
foreach (var item in args) foreach (var item in args)
{ {
@@ -125,6 +143,10 @@ namespace SqlSugar
Default(parameter, model, item); Default(parameter, model, item);
} }
} }
if (appendArgs != null)
{
model.Args.AddRange(appendArgs);
}
var methodValue = GetMdthodValue(name, model); var methodValue = GetMdthodValue(name, model);
base.AppendValue(parameter, isLeft, methodValue); base.AppendValue(parameter, isLeft, methodValue);
} }
@@ -273,7 +295,18 @@ namespace SqlSugar
{ "Equals","Equals"}, { "Equals","Equals"},
{ "ToLower","ToLower"}, { "ToLower","ToLower"},
{ "ToUpper","ToUpper"}, { "ToUpper","ToUpper"},
{ "Substring","Substring"} { "Substring","Substring"},
{ "DateAdd","DateAdd"}
};
private static Dictionary<string, DateType> MethodTimeMapping = new Dictionary<string, DateType>() {
{ "AddYears",DateType.Year},
{ "AddMonths",DateType.Month},
{ "AddDays",DateType.Day},
{ "AddHours",DateType.Hour},
{ "AddMinutes",DateType.Minute},
{ "AddSeconds",DateType.Second},
{ "AddMilliseconds",DateType.Millisecond}
}; };
private void CheckMethod(MethodCallExpression expression) private void CheckMethod(MethodCallExpression expression)