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)); }