mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-11-08 10:24:55 +08:00
Support System.Date.addXXX
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -243,7 +265,7 @@ namespace SqlSugar
|
|||||||
return this.Context.DbMehtods.AggregateCount(model);
|
return this.Context.DbMehtods.AggregateCount(model);
|
||||||
case "MappingColumn":
|
case "MappingColumn":
|
||||||
var mappingColumnResult = this.Context.DbMehtods.MappingColumn(model);
|
var mappingColumnResult = this.Context.DbMehtods.MappingColumn(model);
|
||||||
var isValid= model.Args[0].IsMember&&model.Args[1].IsMember==false;
|
var isValid = model.Args[0].IsMember && model.Args[1].IsMember == false;
|
||||||
Check.Exception(!isValid, "SqlFunc.MappingColumn parameters error, The property name on the left, string value on the right");
|
Check.Exception(!isValid, "SqlFunc.MappingColumn parameters error, The property name on the left, string value on the right");
|
||||||
this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString());
|
this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString());
|
||||||
return mappingColumnResult;
|
return mappingColumnResult;
|
||||||
@@ -273,12 +295,23 @@ 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)
|
||||||
{
|
{
|
||||||
Check.Exception(expression.Method.ReflectedType().FullName != ExpressionConst.SqlFuncFullName,string.Format(ExpressionErrorMessage.MethodError, expression.Method.Name));
|
Check.Exception(expression.Method.ReflectedType().FullName != ExpressionConst.SqlFuncFullName, string.Format(ExpressionErrorMessage.MethodError, expression.Method.Name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user