private Expression ResolveArithmeticLiterals(ArithmeticExpression expression, LiteralExpression leftLiteral, LiteralExpression rightLiteral)
        {
            object left  = leftLiteral.Value;
            object right = rightLiteral.Value;
            object result;

            var type = LiteralUtil.CoerceLiteralValues(ref left, leftLiteral.LiteralType, ref right, rightLiteral.LiteralType);

            switch (expression.Operator)
            {
            case Operator.Add: result = ResolveAdd(left, right, type); break;

            case Operator.Div: result = ResolveDiv(left, right, type); break;

            case Operator.Mod: result = ResolveMod(left, right, type); break;

            case Operator.Mul: result = ResolveMul(left, right, type); break;

            case Operator.Sub: result = ResolveSub(left, right, type); break;

            default:
                throw new NotSupportedException();
            }

            if (result == null)
            {
                throw new ODataException(String.Format(
                                             ErrorMessages.Expression_IncompatibleTypes,
                                             expression.Operator,
                                             type
                                             ));
            }

            return(new LiteralExpression(result, type));
        }
        private Expression ResolveComparisonLiterals(ComparisonExpression expression, LiteralExpression leftLiteral, LiteralExpression rightLiteral)
        {
            object left  = leftLiteral.Value;
            object right = rightLiteral.Value;
            bool   result;

            var type = LiteralUtil.CoerceLiteralValues(ref left, leftLiteral.LiteralType, ref right, rightLiteral.LiteralType);

            switch (expression.Operator)
            {
            case Operator.Eq:
                result = ResolveEquals(left, right, type);
                break;

            case Operator.Ne:
                result = !ResolveEquals(left, right, type);
                break;

            case Operator.Gt:
                result = ResolveCompare(left, right, type) > 0;
                break;

            case Operator.Ge:
                result = ResolveCompare(left, right, type) >= 0;
                break;

            case Operator.Lt:
                result = ResolveCompare(left, right, type) < 0;
                break;

            case Operator.Le:
                result = ResolveCompare(left, right, type) <= 0;
                break;

            default:
                throw new NotSupportedException();
            }

            return(new LiteralExpression(result, LiteralType.Boolean));
        }