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