SqlSugar/SqlSugar/ExpressionsToSql/ResolveItems/BinaryExpressionResolve.cs

71 lines
3.1 KiB
C#
Raw Normal View History

2017-01-07 21:54:51 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace SqlSugar
{
2017-01-07 22:26:44 +08:00
public class BinaryExpressionResolve : BaseResolve
2017-01-07 21:54:51 +08:00
{
2017-01-07 23:56:55 +08:00
public BinaryExpressionResolve(ExpressionParameter parameter) : base(parameter)
2017-01-07 21:54:51 +08:00
{
2017-01-08 13:56:29 +08:00
parameter.BinaryExpressionInfoList =new List<KeyValuePair<string, BinaryExpressionInfo>>();
2017-01-07 23:13:07 +08:00
var expression = this.Expression as BinaryExpression;
2017-01-08 14:07:44 +08:00
var operatorValue = ExpressionTool.GetOperator(expression.NodeType);
2017-01-08 13:56:29 +08:00
var isComparisonOperator =
expression.NodeType != ExpressionType.And &&
expression.NodeType != ExpressionType.AndAlso &&
expression.NodeType != ExpressionType.Or &&
expression.NodeType != ExpressionType.OrElse;
2017-01-08 01:03:26 +08:00
base.BaseExpression = expression;
2017-01-07 23:13:07 +08:00
base.IsLeft = true;
base.Expression = expression.Left;
base.Start();
base.IsLeft = false;
base.Expression = expression.Right;
base.Start();
base.IsLeft = null;
2017-01-08 13:56:29 +08:00
string leftString = GetLeftString(parameter);
string rightString = GetRightString(parameter);
2017-01-08 14:07:44 +08:00
string binarySql =string.Format(ExpressionConst.BinaryFormatString,leftString,operatorValue,rightString);
2017-01-08 13:56:29 +08:00
string sqlWhereString = base.SqlWhere.ToString();
if (base.SqlWhere == null) {
base.SqlWhere = new StringBuilder();
}
2017-01-08 14:07:44 +08:00
if (sqlWhereString.Contains(ExpressionConst.Format0))
2017-01-08 13:56:29 +08:00
{
2017-01-08 14:07:44 +08:00
base.SqlWhere.Replace(ExpressionConst.Format0, sqlWhereString);
2017-01-08 13:56:29 +08:00
}
else
{
base.SqlWhere.Append(binarySql);
}
2017-01-08 14:07:44 +08:00
if (sqlWhereString.Contains(ExpressionConst.Format1))
2017-01-08 13:56:29 +08:00
{
2017-01-08 14:07:44 +08:00
base.SqlWhere.Replace(ExpressionConst.Format1, ExpressionConst.Format0);
2017-01-08 13:56:29 +08:00
}
}
private string GetRightString(ExpressionParameter parameter)
{
2017-01-08 14:11:49 +08:00
var leftInfo = parameter.BinaryExpressionInfoList.Single(it => it.Value.IsLeft).Value;
var rightInfo = parameter.BinaryExpressionInfoList.Single(it => !it.Value.IsLeft).Value;
2017-01-08 15:36:28 +08:00
if (leftInfo.ExpressionType == ExpressionConst.ConstantExpressionType)
{
var sqlParameterKeyWord = parameter.Context.SqlParameterKeyWord;
var reval= string.Format("{0}{1}{2}",sqlParameterKeyWord,leftInfo.Value,parameter.Context.Index+parameter.Index);
parameter.Context.Parameters.Add(new SugarParameter(reval,leftInfo.Value));
return reval;
}
2017-01-08 14:11:49 +08:00
return leftInfo.Value.ObjToString();
2017-01-08 13:56:29 +08:00
}
private string GetLeftString(ExpressionParameter parameter)
{
2017-01-08 14:11:49 +08:00
var leftInfo = parameter.BinaryExpressionInfoList.Single(it => it.Value.IsLeft).Value;
var rightInfo = parameter.BinaryExpressionInfoList.Single(it => !it.Value.IsLeft).Value;
return rightInfo.Value.ObjToString();
2017-01-07 21:54:51 +08:00
}
}
}