コード例 #1
0
        protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression)
        {
            if (methodCallExpression.Method.GetCustomAttribute <QueryAnnotationMethodAttribute>() != null)
            {
                string argumentName;

                methodCallExpression
                    = Expression.Call(
                          QueryAnnotationExtensions.QueryAnnotationMethodInfo
                          .MakeGenericMethod(methodCallExpression.Method.GetGenericArguments()),
                          methodCallExpression.Arguments[0],
                          Expression.Constant(
                              new QueryAnnotation(
                                  methodCallExpression.Method,
                                  methodCallExpression.Arguments
                                  .Select(a => ExpressionEvaluationHelpers.Evaluate(a, out argumentName))
                                  .ToArray())));
            }
            return(base.VisitMethodCall(methodCallExpression));
        }
コード例 #2
0
        public override Expression Visit(Expression expression)
        {
            if (expression == null)
            {
                return(null);
            }

            if (expression.NodeType == ExpressionType.Lambda ||
                !_partialEvaluationInfo.IsEvaluatableExpression(expression))
            {
                return(base.Visit(expression));
            }

            var e = expression;

            if (expression.NodeType == ExpressionType.Convert)
            {
                if (expression.RemoveConvert() is ConstantExpression)
                {
                    return(expression);
                }

                var unaryExpression = (UnaryExpression)expression;

                if ((unaryExpression.Type.IsNullableType() &&
                     !unaryExpression.Operand.Type.IsNullableType()) ||
                    unaryExpression.Type == typeof(object))
                {
                    e = unaryExpression.Operand;
                }
            }

            if (!typeof(IQueryable).GetTypeInfo().IsAssignableFrom(e.Type.GetTypeInfo()))
            {
                var constantExpression = e as ConstantExpression;

                if (constantExpression == null ||
                    (constantExpression.Type != typeof(string) &&
                     constantExpression.Type != typeof(byte[]) &&
                     constantExpression.Value is IEnumerable))
                {
                    try
                    {
                        string parameterName;

                        var parameterValue = ExpressionEvaluationHelpers.Evaluate(e, out parameterName);

                        if (parameterName == null)
                        {
                            parameterName = "p";
                        }

                        var compilerPrefixIndex = parameterName.LastIndexOf(">", StringComparison.Ordinal);

                        if (compilerPrefixIndex != -1)
                        {
                            parameterName = parameterName.Substring(compilerPrefixIndex + 1);
                        }

                        parameterName
                            = $"{CompiledQueryCache.CompiledQueryParameterPrefix}{parameterName}_{_queryContext.ParameterValues.Count}";

                        _queryContext.ParameterValues.Add(parameterName, parameterValue);

                        return(e.Type == expression.Type
                            ? Expression.Parameter(e.Type, parameterName)
                            : (Expression)Expression.Convert(
                                   Expression.Parameter(e.Type, parameterName),
                                   expression.Type));
                    }
                    catch (Exception exception)
                    {
                        throw new InvalidOperationException(
                                  CoreStrings.ExpressionParameterizationException(expression),
                                  exception);
                    }
                }
            }

            return(expression);
        }