CRLExpression BinaryExpressionHandler(Expression left, Expression right, ExpressionType type, int level = 1) { var types = new ExpressionType[] { ExpressionType.Equal, ExpressionType.GreaterThan, ExpressionType.GreaterThanOrEqual, ExpressionType.LessThan, ExpressionType.LessThanOrEqual, ExpressionType.NotEqual }; var leftPar = RouteExpressionHandler(left); var isBinary = types.Contains(type); var rightPar = RouteExpressionHandler(right); var e = new CRLExpression() { ExpType = type, Left = leftPar, Right = rightPar, Type = isBinary ? CRLExpressionType.Binary : CRLExpressionType.Tree }; return(e); }
CRLExpression.CRLExpression BinaryExpressionHandler(Expression left, Expression right, ExpressionType type) { StringBuilder sb = new StringBuilder(); sb.Append("("); var leftPar = RouteExpressionHandler(left); string typeStr = ExpressionTypeCast(type); var rightPar = RouteExpressionHandler(right); #region 修正bool值一元运算 //t1.isTop=1 if (leftPar.Type == CRLExpression.CRLExpressionType.Binary && rightPar.Type == CRLExpression.CRLExpressionType.Name) { var proType = ((MemberExpression)right).Type; if (proType == typeof(bool)) { rightPar.Data = rightPar.Data + "=1"; } } else if (rightPar.Type == CRLExpression.CRLExpressionType.Binary && leftPar.Type == CRLExpression.CRLExpressionType.Name) { var proType = ((MemberExpression)left).Type; if (proType == typeof(bool)) { leftPar.Data = leftPar.Data + "=1"; } } #endregion string typeStr2; leftPar = DealParame(leftPar, typeStr, out typeStr2); sb.Append(leftPar.Data); rightPar = DealParame(rightPar, typeStr, out typeStr2); sb.Append(typeStr2); sb.Append(rightPar.Data); sb.Append(")"); //return sb.ToString(); var types = new ExpressionType[] { ExpressionType.Equal, ExpressionType.GreaterThan, ExpressionType.GreaterThanOrEqual, ExpressionType.LessThan, ExpressionType.LessThanOrEqual, ExpressionType.NotEqual }; var isBinary = types.Contains(type); var e = new CRLExpression.CRLExpression() { ExpressionType = type.ToString(), Left = leftPar, Right = rightPar, Type = isBinary ? CRLExpression.CRLExpressionType.Binary : CRLExpression.CRLExpressionType.Tree }; e.SqlOut = sb.ToString(); e.Data = e.SqlOut; return(e); }
private static void Split(Expression expression, ICollection<Expression> list, ExpressionType[] binarySeparators) { if (expression != null) { if (binarySeparators.Contains(expression.NodeType)) { var binaryExpression = expression as BinaryExpression; if (binaryExpression != null) { Split(binaryExpression.Left, list, binarySeparators); Split(binaryExpression.Right, list, binarySeparators); } } else { list.Add(expression); } } }