SqlSugar.ResolveExpress.BinaryExpression C# (CSharp) Method

BinaryExpression() private method

private BinaryExpression ( Expression exp ) : string
exp System.Linq.Expressions.Expression
return string
        private string BinaryExpression(Expression exp)
        {
            var expression = exp as BinaryExpression;
            var isComparisonOperator =
            expression.NodeType != ExpressionType.And &&
            expression.NodeType != ExpressionType.AndAlso &&
            expression.NodeType != ExpressionType.Or &&
            expression.NodeType != ExpressionType.OrElse;
            MemberType leftType = MemberType.None;
            MemberType rightType = MemberType.None;
            var leftIsDateTime = expression.Left.Type.ToString().Contains("System.DateTime");
            var rightIsDateTime = expression.Right.Type.ToString().Contains("System.DateTime");
            var left = CreateSqlElements(expression.Left, ref leftType, true, isComparisonOperator);
            var right = CreateSqlElements(expression.Right, ref rightType, true, isComparisonOperator);
            var oper = GetOperator(expression.NodeType);
            var isKeyOperValue = leftType == MemberType.Key && rightType == MemberType.Value;
            var isValueOperKey = rightType == MemberType.Key && leftType == MemberType.Value;
            #region 处理 null

            if (isKeyOperValue && right.IsGuid() && ConstantBoolDictionary.Any(it => it.Key.ToString() == right))
            {
                right = ConstantBoolDictionary.Single(it => it.Key.ToString() == right).NewValue;
            }
            if (isValueOperKey && ConstantBoolDictionary.Any(it => it.Key.ToString() == left))
            {
                left = ConstantBoolDictionary.Single(it => it.Key.ToString() == left).NewValue;
            }

            if (isKeyOperValue & (right == "null" || right == null) && oper.Trim() == "=")
            {
                var oldLeft = AddParas(ref left, right);
                return string.Format(" ({0} is null ) ", oldLeft);
            }
            else if (isKeyOperValue & (right == "null" || right == null) && oper.Trim() == "<>")
            {
                var oldLeft = AddParas(ref left, right);
                return string.Format(" ({0} is not null ) ", oldLeft);
            }
            else if (isValueOperKey & (left == "null" || left == null) && oper.Trim() == "=")
            {
                return string.Format(" ({0} is null ) ", right);
            }
            else if (isValueOperKey & (left == "null" || left == null) && oper.Trim() == "<>")
            {
                return string.Format(" ({0} is not null ) ", right);
            }
            #endregion
            else if (isKeyOperValue)
            {
                object parValue = null;
                if (leftIsDateTime && right != null && right.IsDate())
                {
                    parValue = Convert.ToDateTime(right);
                }
                else
                {
                    parValue = right;
                }
                if (left.Contains("("))
                {
                    return string.Format(" ({0} {1} {2}) ",left, oper, right.ToSqlValue());
                }
                else
                {
                    var oldLeft = AddParas(ref left, parValue);
                    return string.Format(" ({0} {1} " + SqlSugarTool.ParSymbol + "{2}) ", oldLeft.GetTranslationSqlName(), oper, left);
                }
            }
            else if (isValueOperKey)
            {
                object parValue = null;
                if (rightIsDateTime && left != null && left.IsDate())
                {
                    parValue = Convert.ToDateTime(left);
                }
                else
                {
                    parValue = left;
                }
                if (right.Contains("("))
                {
                    return string.Format(" ({0} {1} {2}) ", left.ToSqlValue(), oper, right);
                }
                else
                {
                    var oldRight = AddParasReturnRight(parValue, ref  right);
                    return string.Format("( " + SqlSugarTool.ParSymbol + "{0} {1} {2} )", right, oper, oldRight.GetTranslationSqlName());
                }
            }
            else if (leftType == MemberType.Value && rightType == MemberType.Value)
            {
                var isAndOr = oper.ObjToString().IsIn("AND","OR");
                if (isAndOr)
                {
                    return string.Format("( {0} {1} {2} )", left, oper, right);
                }
                else
                {
                    return string.Format("( '{0}' {1} '{2}' )", left, oper, right);
                }
            }
            else
            {
                return string.Format("( {0} {1} {2} )", left, oper, right);
            }
        }