Exemple #1
0
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            if (node == null)
            {
                throw new ArgumentNullException(nameof(node));
            }

            if (node.Object != null &&
                node.Object.NodeType == ExpressionType.MemberAccess &&
                ((MemberExpression)node.Object).RootExpressionType() == ExpressionType.Parameter)
            {
                string format;

                if (node.Method.Name == "StartsWith" ||
                    node.Method.Name == "Contains" ||
                    node.Method.Name == "EndsWith")
                {
                    format = "({0} LIKE {1})";
                }
                else if (node.Method.Name == "IgnoreExpression")
                {
                    return(node);
                }
                else
                {
                    throw new NotSupportedException($"不受支持的方法调用 {node.Method.Name}");
                }
                // 解析的时候需要在其他方法内根据方法名拼接字符串,
                // 所以在这里需要一个全局变量保存方法名
                _tempMethod = node.Method.Name;

                Visit(node.Object);
                Visit(node.Arguments[0]);

                var right = _stringStack.Pop();
                var left  = _stringStack.Pop();
                _stringStack.Push(string.Format(format, left, right));
            }
            else if (node.Method.Name == "DefaultTrue")
            {
                _stringStack.Push("1=1");
            }
            else if (node.Method.Name == "DefaultFalse")
            {
                _stringStack.Push("1=0");
            }
            else
            {
                var obj = ResolveValue(node.GetValue());

                var parameterName = $"{_prefix}__p_{_parameterIndex++}";
                _parameters.Add(new KeyValuePair <string, object>(parameterName, obj));
                _stringStack.Push($" {parameterName} ");
            }

            return(node);
        }
Exemple #2
0
 protected override Expression VisitMethodCall(MethodCallExpression node)
 {
     if (node.InvolvesParameter())
     {
         HandleParameter(node);
     }
     else
     {
         _sb.Append("@" + Parameters.CurrentIndex);
         Parameters.RegisterParameter(node.GetValue());
     }
     return(node);
 }
        private string ResolveCallClause(MethodCallExpression node)
        {
            var obj = node.Object;

            if (obj != null && obj.NodeType == ExpressionType.MemberAccess)
            {
                var expression   = (MemberExpression)obj;
                var rootNodeType = expression.GetRootType(out var stack);

                if (rootNodeType == ExpressionType.Parameter)
                {
                    return(ResolveParameterMemberMethodCall(node, stack));
                }
            }

            var value = (bool)node.GetValue();

            return(value ? "1=1" : "1<>1");
        }
Exemple #4
0
        /// <summary>
        /// Get the value from an expression.
        /// </summary>
        /// <param name="expression">The expression to be evaluated.</param>
        /// <returns>the value.</returns>
        public static object GetValue(this Expression expression, JsonSerializerSettings jsonSerializerSettings)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            switch (expression.NodeType)
            {
            case ExpressionType.Constant:
            {
                ConstantExpression constantExpression = expression as ConstantExpression;
                if (constantExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(ConstantExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(constantExpression.GetValue());
            }

            case ExpressionType.Call:
            {
                MethodCallExpression methodCallExpression = expression as MethodCallExpression;
                if (methodCallExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(MethodCallExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(methodCallExpression.GetValue(jsonSerializerSettings));
            }

            case ExpressionType.Convert:
            {
                UnaryExpression unaryExpression = expression as UnaryExpression;
                if (unaryExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(UnaryExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(unaryExpression.GetValue(jsonSerializerSettings));
            }

            case ExpressionType.MemberAccess:
            {
                MemberExpression memberExpression = expression as MemberExpression;
                if (memberExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(MemberExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(memberExpression.GetValue(jsonSerializerSettings));
            }

            case ExpressionType.New:
            {
                NewExpression newExpression = expression as NewExpression;
                if (newExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(NewExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(newExpression.GetValue(jsonSerializerSettings));
            }

            case ExpressionType.Not:
            {
                UnaryExpression unaryExpression = expression as UnaryExpression;
                if (unaryExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(UnaryExpression)}\r\n\t{expression}", nameof(expression));
                }

                object unaryValue = unaryExpression.GetValue(jsonSerializerSettings);
                if (unaryValue == null ||
                    (unaryValue.GetType() != typeof(bool) && unaryValue.GetType() != typeof(bool?)))
                {
                    throw new ArgumentException($"Invalid type", nameof(expression));
                }

                return(!((bool)unaryValue));
            }

            case ExpressionType.Parameter:
            {
                ParameterExpression parameterExpression = expression as ParameterExpression;
                if (parameterExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(ParameterExpression)}\r\n\t{expression}", nameof(expression));
                }

                throw new ArgumentException($"Invalid expression type {expression.NodeType}\r\n\t{expression}", nameof(expression));
            }


            case ExpressionType.NewArrayInit:
            {
                NewArrayExpression newArrayExpression = expression as NewArrayExpression;
                if (newArrayExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(NewArrayExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(newArrayExpression.Expressions.Select(_ => _.GetValue(jsonSerializerSettings)).ToArray());
            }

            default:
                throw new ArgumentException($"Invalid expression type {expression.NodeType}\r\n\t{expression}", nameof(expression));
            }
        }
Exemple #5
0
        public static object GetValue(this Expression expression)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            switch (expression.NodeType)
            {
            case ExpressionType.Constant:
            {
                ConstantExpression constantExpression = expression as ConstantExpression;
                if (constantExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(ConstantExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(constantExpression.GetValue());
            }

            case ExpressionType.Call:
            {
                MethodCallExpression methodCallExpression = expression as MethodCallExpression;
                if (methodCallExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(MethodCallExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(methodCallExpression.GetValue());
            }

            case ExpressionType.Convert:
            {
                UnaryExpression unaryExpression = expression as UnaryExpression;
                if (unaryExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(UnaryExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(unaryExpression.GetValue());
            }

            case ExpressionType.MemberAccess:
            {
                MemberExpression memberExpression = expression as MemberExpression;
                if (memberExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(MemberExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(memberExpression.GetValue());
            }

            case ExpressionType.New:
            {
                NewExpression newExpression = expression as NewExpression;
                if (newExpression == null)
                {
                    throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(NewExpression)}\r\n\t{expression}", nameof(expression));
                }

                return(newExpression.GetValue());
            }

            default:
                throw new ArgumentException($"Invalid expression type {expression.NodeType}\r\n\t{expression}", nameof(expression));
            }
        }