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));
        }
示例#2
0
        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));
        }