You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

129 lines
6.1 KiB

using System.Collections.Generic;
using System.Linq.Expressions;
namespace SqlSugar
{
public class UnaryExpressionResolve : BaseResolve
{
public UnaryExpressionResolve(ExpressionParameter parameter) : base(parameter)
{
var expression = base.Expression as UnaryExpression;
var baseParameter = parameter.BaseParameter;
switch (this.Context.ResolveType)
{
case ResolveExpressType.WhereSingle:
case ResolveExpressType.WhereMultiple:
case ResolveExpressType.FieldSingle:
case ResolveExpressType.FieldMultiple:
case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple:
case ResolveExpressType.ArraySingle:
case ResolveExpressType.ArrayMultiple:
case ResolveExpressType.Update:
var nodeType = expression.NodeType;
base.Expression = expression.Operand;
var isMember = expression.Operand is MemberExpression;
var isConst = expression.Operand is ConstantExpression;
var offsetIsNull = (parameter.OppsiteExpression is ConstantExpression)
&&(parameter.OppsiteExpression as ConstantExpression).Value==null
&&ExpressionTool.IsComparisonOperator(expression.Operand);
if (isMember && offsetIsNull) {
Append(parameter, nodeType);
}
else if (baseParameter.CurrentExpression is NewArrayExpression)
{
Result(parameter, nodeType);
}
else if (base.Expression is BinaryExpression || parameter.BaseExpression is BinaryExpression || baseParameter.CommonTempData.ObjToString() == CommonTempDataType.Append.ToString())
{
Append(parameter, nodeType);
}
else if (isMember)
{
MemberLogic(parameter, baseParameter, nodeType);
}
else if (isConst)
{
Result(parameter, nodeType);
}
else
{
Append(parameter, nodeType);
}
break;
default:
break;
}
}
private void MemberLogic(ExpressionParameter parameter, ExpressionParameter baseParameter, ExpressionType nodeType)
{
var memberExpression = (base.Expression as MemberExpression);
var isLogicOperator = ExpressionTool.IsLogicOperator(baseParameter.OperatorValue) || baseParameter.OperatorValue.IsNullOrEmpty();
var isHasValue = isLogicOperator && memberExpression.Member.Name == "HasValue" && memberExpression.Expression != null && memberExpression.NodeType == ExpressionType.MemberAccess;
if (isHasValue)
{
var member = memberExpression.Expression as MemberExpression;
parameter.CommonTempData = CommonTempDataType.Result;
var isConst = member.Expression != null && member.Expression is ConstantExpression;
if (isConst)
{
var paramterValue = ExpressionTool.DynamicInvoke(member);
var paramterName= base.AppendParameter(paramterValue);
var result = this.Context.DbMehtods.HasValue(new MethodCallExpressionModel
{
Args = new List<MethodCallExpressionArgs> {
new MethodCallExpressionArgs { IsMember=false, MemberName=paramterName, MemberValue=paramterValue } }
});
this.Context.Result.Append(result);
}
else
{
this.Expression = isConst ? member.Expression : member;
this.Start();
var methodParamter = isConst ? new MethodCallExpressionArgs { IsMember = false } : new MethodCallExpressionArgs { IsMember = true, MemberName = parameter.CommonTempData, MemberValue = null };
var result = this.Context.DbMehtods.HasValue(new MethodCallExpressionModel
{
Args = new List<MethodCallExpressionArgs> {
methodParamter
}
});
this.Context.Result.Append(result);
parameter.CommonTempData = null;
}
}
else if (memberExpression.Type == UtilConstants.BoolType && isLogicOperator)
{
Append(parameter, nodeType);
}
else
{
Result(parameter, nodeType);
}
}
private void Result(ExpressionParameter parameter, ExpressionType nodeType)
{
BaseParameter.ChildExpression = base.Expression;
parameter.CommonTempData = CommonTempDataType.Result;
if (nodeType == ExpressionType.Not)
AppendNot(parameter.CommonTempData);
base.Start();
parameter.BaseParameter.CommonTempData = parameter.CommonTempData;
parameter.BaseParameter.ChildExpression = base.Expression;
parameter.CommonTempData = null;
}
private void Append(ExpressionParameter parameter, ExpressionType nodeType)
{
BaseParameter.ChildExpression = base.Expression;
this.IsLeft = parameter.IsLeft;
parameter.CommonTempData = CommonTempDataType.Append;
if (nodeType == ExpressionType.Not)
AppendNot(parameter.CommonTempData);
base.Start();
parameter.BaseParameter.CommonTempData = parameter.CommonTempData;
parameter.BaseParameter.ChildExpression = base.Expression;
parameter.CommonTempData = null;
}
}
}