2017-01-30 15:10:54 +08:00
|
|
|
|
using SqlSugar;
|
|
|
|
|
using System;
|
2017-01-07 21:54:51 +08:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Linq.Expressions;
|
|
|
|
|
using System.Text;
|
|
|
|
|
namespace SqlSugar
|
|
|
|
|
{
|
2017-01-30 15:10:54 +08:00
|
|
|
|
public class MethodCallExpressionResolve : BaseResolve
|
2017-01-07 21:54:51 +08:00
|
|
|
|
{
|
2017-01-07 23:56:55 +08:00
|
|
|
|
public MethodCallExpressionResolve(ExpressionParameter parameter) : base(parameter)
|
2017-01-07 21:54:51 +08:00
|
|
|
|
{
|
2017-01-30 15:10:54 +08:00
|
|
|
|
var express = base.Expression as MethodCallExpression;
|
2017-01-31 20:13:22 +08:00
|
|
|
|
var isLeft = parameter.IsLeft;
|
2017-01-30 15:10:54 +08:00
|
|
|
|
CheckMethod(express);
|
|
|
|
|
var method = express.Method;
|
|
|
|
|
string name = method.Name;
|
|
|
|
|
var args = express.Arguments;
|
|
|
|
|
MethodCallExpressionModel model = new MethodCallExpressionModel();
|
|
|
|
|
model.Args = new List<MethodCallExpressionArgs>();
|
|
|
|
|
switch (this.Context.ResolveType)
|
|
|
|
|
{
|
|
|
|
|
case ResolveExpressType.WhereSingle:
|
|
|
|
|
case ResolveExpressType.WhereMultiple:
|
2017-04-30 16:11:51 +08:00
|
|
|
|
WhereMethod(parameter, isLeft, name, args, model);
|
2017-01-30 15:10:54 +08:00
|
|
|
|
break;
|
|
|
|
|
case ResolveExpressType.SelectSingle:
|
|
|
|
|
case ResolveExpressType.SelectMultiple:
|
2017-05-24 20:35:23 +08:00
|
|
|
|
case ResolveExpressType.Update:
|
2017-04-30 16:11:51 +08:00
|
|
|
|
SelectMethod(parameter, isLeft, name, args, model);
|
|
|
|
|
break;
|
2017-01-30 15:10:54 +08:00
|
|
|
|
case ResolveExpressType.FieldSingle:
|
|
|
|
|
case ResolveExpressType.FieldMultiple:
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-04-30 16:11:51 +08:00
|
|
|
|
private void SelectMethod(ExpressionParameter parameter, bool? isLeft, string name, System.Collections.ObjectModel.ReadOnlyCollection<Expression> args, MethodCallExpressionModel model)
|
|
|
|
|
{
|
|
|
|
|
foreach (var item in args)
|
|
|
|
|
{
|
|
|
|
|
parameter.CommonTempData = CommonTempDataType.ChildNodeSet;
|
|
|
|
|
base.Expression = item;
|
|
|
|
|
base.Start();
|
|
|
|
|
var methodCallExpressionArgs = new MethodCallExpressionArgs()
|
|
|
|
|
{
|
|
|
|
|
IsMember = parameter.ChildExpression is MemberExpression,
|
|
|
|
|
MemberName = parameter.CommonTempData
|
|
|
|
|
};
|
|
|
|
|
var value = methodCallExpressionArgs.MemberName;
|
|
|
|
|
if (methodCallExpressionArgs.IsMember)
|
|
|
|
|
{
|
|
|
|
|
var childExpression = parameter.ChildExpression as MemberExpression;
|
|
|
|
|
if (childExpression.Expression != null && childExpression.Expression is ConstantExpression)
|
|
|
|
|
{
|
|
|
|
|
methodCallExpressionArgs.IsMember = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (methodCallExpressionArgs.IsMember == false)
|
|
|
|
|
{
|
|
|
|
|
var parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.METHODCONST + this.Context.ParameterIndex;
|
|
|
|
|
this.Context.ParameterIndex++;
|
|
|
|
|
methodCallExpressionArgs.MemberName = parameterName;
|
|
|
|
|
methodCallExpressionArgs.MemberValue = value;
|
|
|
|
|
this.Context.Parameters.Add(new SugarParameter(parameterName, value));
|
|
|
|
|
}
|
|
|
|
|
model.Args.Add(methodCallExpressionArgs);
|
|
|
|
|
}
|
|
|
|
|
parameter.BaseParameter.CommonTempData = GetMdthodValue(name, model);
|
|
|
|
|
}
|
|
|
|
|
private void WhereMethod(ExpressionParameter parameter, bool? isLeft, string name, System.Collections.ObjectModel.ReadOnlyCollection<Expression> args, MethodCallExpressionModel model)
|
|
|
|
|
{
|
|
|
|
|
foreach (var item in args)
|
|
|
|
|
{
|
|
|
|
|
parameter.CommonTempData = CommonTempDataType.ChildNodeSet;
|
|
|
|
|
base.Expression = item;
|
|
|
|
|
base.Start();
|
|
|
|
|
var methodCallExpressionArgs = new MethodCallExpressionArgs()
|
|
|
|
|
{
|
|
|
|
|
IsMember = parameter.ChildExpression is MemberExpression,
|
|
|
|
|
MemberName = parameter.CommonTempData
|
|
|
|
|
};
|
|
|
|
|
var value = methodCallExpressionArgs.MemberName;
|
|
|
|
|
if (methodCallExpressionArgs.IsMember)
|
|
|
|
|
{
|
|
|
|
|
var childExpression = parameter.ChildExpression as MemberExpression;
|
|
|
|
|
if (childExpression.Expression != null && childExpression.Expression is ConstantExpression)
|
|
|
|
|
{
|
|
|
|
|
methodCallExpressionArgs.IsMember = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (methodCallExpressionArgs.IsMember == false)
|
|
|
|
|
{
|
|
|
|
|
var parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.METHODCONST + this.Context.ParameterIndex;
|
|
|
|
|
this.Context.ParameterIndex++;
|
|
|
|
|
methodCallExpressionArgs.MemberName = parameterName;
|
|
|
|
|
methodCallExpressionArgs.MemberValue = value;
|
|
|
|
|
this.Context.Parameters.Add(new SugarParameter(parameterName, value));
|
|
|
|
|
}
|
|
|
|
|
model.Args.Add(methodCallExpressionArgs);
|
|
|
|
|
}
|
|
|
|
|
var methodValue = GetMdthodValue(name, model);
|
|
|
|
|
base.AppendValue(parameter, isLeft, methodValue);
|
|
|
|
|
}
|
2017-01-31 20:13:22 +08:00
|
|
|
|
|
2017-01-30 15:10:54 +08:00
|
|
|
|
private object GetMdthodValue(string name, MethodCallExpressionModel model)
|
|
|
|
|
{
|
|
|
|
|
switch (name)
|
|
|
|
|
{
|
|
|
|
|
case "IsNullOrEmpty":
|
2017-01-30 16:42:33 +08:00
|
|
|
|
return this.Context.DbMehtods.IsNullOrEmpty(model);
|
2017-01-30 18:53:06 +08:00
|
|
|
|
case "ToLower":
|
|
|
|
|
return this.Context.DbMehtods.ToLower(model);
|
2017-01-30 21:54:23 +08:00
|
|
|
|
case "ToUpper":
|
|
|
|
|
return this.Context.DbMehtods.ToUpper(model);
|
2017-01-30 22:05:08 +08:00
|
|
|
|
case "Trim":
|
|
|
|
|
return this.Context.DbMehtods.Trim(model);
|
2017-01-31 20:39:57 +08:00
|
|
|
|
case "Contains":
|
2017-04-30 14:31:07 +08:00
|
|
|
|
return this.Context.DbMehtods.Contains(model);
|
|
|
|
|
case "ContainsArray":
|
|
|
|
|
return this.Context.DbMehtods.ContainsArray(model);
|
2017-04-29 22:51:41 +08:00
|
|
|
|
case "Equals":
|
|
|
|
|
return this.Context.DbMehtods.Equals(model);
|
|
|
|
|
case "DateIsSame":
|
|
|
|
|
if (model.Args.Count == 2)
|
|
|
|
|
return this.Context.DbMehtods.DateIsSameDay(model);
|
|
|
|
|
else
|
|
|
|
|
return this.Context.DbMehtods.DateIsSameByType(model);
|
|
|
|
|
case "DateAdd":
|
|
|
|
|
if (model.Args.Count == 2)
|
|
|
|
|
return this.Context.DbMehtods.DateAddDay(model);
|
|
|
|
|
else
|
|
|
|
|
return this.Context.DbMehtods.DateAddByType(model);
|
2017-04-29 23:37:49 +08:00
|
|
|
|
case "DateValue":
|
|
|
|
|
return this.Context.DbMehtods.DateValue(model);
|
2017-04-29 23:08:14 +08:00
|
|
|
|
case "Between":
|
|
|
|
|
return this.Context.DbMehtods.Between(model);
|
2017-04-29 23:20:31 +08:00
|
|
|
|
case "StartsWith":
|
|
|
|
|
return this.Context.DbMehtods.StartsWith(model);
|
|
|
|
|
case "EndsWith":
|
|
|
|
|
return this.Context.DbMehtods.EndsWith(model);
|
2017-04-30 12:05:05 +08:00
|
|
|
|
case "ToInt32":
|
|
|
|
|
return this.Context.DbMehtods.ToInt32(model);
|
|
|
|
|
case "ToInt64":
|
|
|
|
|
return this.Context.DbMehtods.ToInt64(model);
|
|
|
|
|
case "ToDate":
|
|
|
|
|
return this.Context.DbMehtods.ToDate(model);
|
|
|
|
|
case "ToString":
|
|
|
|
|
return this.Context.DbMehtods.ToString(model);
|
|
|
|
|
case "ToDecimal":
|
|
|
|
|
return this.Context.DbMehtods.ToDecimal(model);
|
|
|
|
|
case "ToGuid":
|
|
|
|
|
return this.Context.DbMehtods.ToGuid(model);
|
|
|
|
|
case "ToDouble":
|
|
|
|
|
return this.Context.DbMehtods.ToDouble(model);
|
|
|
|
|
case "ToBool":
|
|
|
|
|
return this.Context.DbMehtods.ToBool(model);
|
|
|
|
|
case "Substring":
|
|
|
|
|
return this.Context.DbMehtods.Substring(model);
|
|
|
|
|
case "Replace":
|
|
|
|
|
return this.Context.DbMehtods.Replace(model);
|
|
|
|
|
case "Length":
|
|
|
|
|
return this.Context.DbMehtods.Length(model);
|
2017-04-30 16:11:51 +08:00
|
|
|
|
case "AggregateSum":
|
|
|
|
|
return this.Context.DbMehtods.AggregateSum(model);
|
|
|
|
|
case "AggregateAvg":
|
|
|
|
|
return this.Context.DbMehtods.AggregateAvg(model);
|
|
|
|
|
case "AggregateMin":
|
|
|
|
|
return this.Context.DbMehtods.AggregateMin(model);
|
|
|
|
|
case "AggregateMax":
|
|
|
|
|
return this.Context.DbMehtods.AggregateMax(model);
|
|
|
|
|
case "AggregateCount":
|
|
|
|
|
return this.Context.DbMehtods.AggregateCount(model);
|
2017-01-30 15:10:54 +08:00
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void CheckMethod(MethodCallExpression expression)
|
|
|
|
|
{
|
|
|
|
|
Check.Exception(expression.Method.ReflectedType.FullName != ExpressionConst.NBORMFULLNAME, ExpressionErrorMessage.MethodError);
|
2017-01-07 21:54:51 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|