public override ExpressionResult VisitBinary(EntityGraphQLParser.BinaryContext context) { var left = Visit(context.left); var right = Visit(context.right); var op = MakeOperator(context.op.GetText()); // we may need to do some converting here if (left.Type != right.Type) { if (op == ExpressionType.Equal || op == ExpressionType.NotEqual) { var result = DoObjectComparisonOnDifferentTypes(op, left, right); if (result != null) { return(result); } } return(ConvertLeftOrRight(op, left, right)); } if (op == ExpressionType.Add && left.Type == typeof(string) && right.Type == typeof(string)) { return((ExpressionResult)Expression.Call(null, typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) }), left, right)); } return((ExpressionResult)Expression.MakeBinary(op, left, right)); }
public override ExpressionResult VisitBinary(EntityGraphQLParser.BinaryContext context) { var left = Visit(context.left); var right = Visit(context.right); var op = MakeOperator(context.op.GetText()); // we may need to do some converting here if (left.Type != right.Type) { if (op == ExpressionType.Equal || op == ExpressionType.NotEqual) { var result = DoObjectComparisonOnDifferentTypes(op, left, right); if (result != null) { return(result); } } return(ConvertLeftOrRight(op, left, right)); } if (left.Type == typeof(string) && right.Type == typeof(string)) { if (op == ExpressionType.Add) { return((ExpressionResult)Expression.Call(null, typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) }), left, right)); } if (op == ExpressionType.GreaterThan || op == ExpressionType.GreaterThanOrEqual || op == ExpressionType.LessThan || op == ExpressionType.LessThanOrEqual) { MethodInfo methodInfo = typeof(string).GetMethod("CompareTo", new[] { typeof(string) }); var callExpr = Expression.Call(left, methodInfo, right); ExpressionResult searchExpr = null; if (op == ExpressionType.GreaterThan) { searchExpr = (ExpressionResult)Expression.GreaterThan(callExpr, Expression.Constant(0)); } if (op == ExpressionType.GreaterThanOrEqual) { searchExpr = (ExpressionResult)Expression.GreaterThanOrEqual(callExpr, Expression.Constant(0)); } if (op == ExpressionType.LessThan) { searchExpr = (ExpressionResult)Expression.LessThan(callExpr, Expression.Constant(0)); } if (op == ExpressionType.LessThanOrEqual) { searchExpr = (ExpressionResult)Expression.LessThanOrEqual(callExpr, Expression.Constant(0)); } return(searchExpr); } } return((ExpressionResult)Expression.MakeBinary(op, left, right)); }