SqlSugar/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs

186 lines
8.6 KiB
C#
Raw Normal View History

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
}
}
}