protected override Expression VisitMethodCallExpression(MethodCallExpression methodCallExpression) { var newExpression = (MethodCallExpression)base.VisitMethodCallExpression(methodCallExpression); if (newExpression != methodCallExpression && newExpression.Arguments.Any() && newExpression.Arguments[0].Type == typeof(IValueReader)) { return (_queryModelVisitor .BindMethodCallToValueReader(methodCallExpression, newExpression.Arguments[0]) ?? newExpression); } return(_queryModelVisitor .BindMethodCallExpression( methodCallExpression, (property, _) => Expression.Call( _getValueMethodInfo.MakeGenericMethod(newExpression.Method.GetGenericArguments()[0]), EntityQueryModelVisitor.QueryContextParameter, newExpression.Arguments[0], Expression.Constant(property))) ?? newExpression); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> protected override Expression VisitMethodCall(MethodCallExpression node) { var newExpression = (MethodCallExpression)base.VisitMethodCall(node); _queryModelVisitor.BindMethodCallExpression( node, (property, querySource) => { if (querySource != null) { DemoteQuerySource(querySource); } }); if (AnonymousObject.IsGetValueExpression(node, out var querySourceReferenceExpression)) { DemoteQuerySource(querySourceReferenceExpression.ReferencedQuerySource); } foreach (var subQueryExpression in newExpression.Arguments.OfType <SubQueryExpression>()) { if (subQueryExpression.QueryModel.ResultOperators.LastOrDefault() is IQuerySource querySourceResultOperator) { PromoteQuerySource(querySourceResultOperator); } else if (subQueryExpression.QueryModel.SelectClause.Selector is QuerySourceReferenceExpression qsre) { PromoteQuerySource(qsre.ReferencedQuerySource); } } return(newExpression); }
protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) { Check.NotNull(methodCallExpression, nameof(methodCallExpression)); MethodCallExpression newExpression = null; Expression firstArgument = null; if (methodCallExpression.Method.IsGenericMethod && ReferenceEquals( methodCallExpression.Method.GetGenericMethodDefinition(), EntityQueryModelVisitor.PropertyMethodInfo)) { var newArguments = VisitAndConvert(methodCallExpression.Arguments, "VisitMethodCall"); if (newArguments[0].Type == typeof(ValueBuffer)) { firstArgument = newArguments[0]; // Compensate for ValueBuffer being a struct, and hence not compatible with Object method newExpression = Expression.Call( methodCallExpression.Method, Expression.Convert(newArguments[0], typeof(object)), newArguments[1]); } } if (newExpression == null) { newExpression = (MethodCallExpression)base.VisitMethodCall(methodCallExpression); } firstArgument = firstArgument ?? newExpression.Arguments.FirstOrDefault(); if (newExpression != methodCallExpression && firstArgument?.Type == typeof(ValueBuffer)) { return (_queryModelVisitor .BindMethodCallToValueBuffer(methodCallExpression, firstArgument) ?? newExpression); } return(_queryModelVisitor .BindMethodCallExpression( methodCallExpression, (property, _) => Expression.Call( _getValueMethodInfo.MakeGenericMethod(newExpression.Method.GetGenericArguments()[0]), EntityQueryModelVisitor.QueryContextParameter, newExpression.Arguments[0], Expression.Constant(property))) ?? newExpression); }
protected override Expression VisitMethodCallExpression(MethodCallExpression methodCallExpression) { var newExpression = base.VisitMethodCallExpression(methodCallExpression); _queryModelVisitor .BindMethodCallExpression( methodCallExpression, (property, querySource) => _querySources[querySource]--); return(newExpression); }
protected override Expression VisitMethodCallExpression(MethodCallExpression methodCallExpression) { MethodCallExpression newExpression = null; if (methodCallExpression.Method.IsGenericMethod && ReferenceEquals( methodCallExpression.Method.GetGenericMethodDefinition(), QueryExtensions.PropertyMethodInfo)) { var newArguments = VisitAndConvert(methodCallExpression.Arguments, "VisitMethodCallExpression"); if (newArguments[0].Type == typeof(ValueBuffer)) { // Compensate for ValueBuffer being a struct, and hence not compatible with Object method newExpression = Expression.Call( QueryExtensions.ValueBufferPropertyMethodInfo .MakeGenericMethod(methodCallExpression.Method.GetGenericArguments()), newArguments); } } if (newExpression == null) { newExpression = (MethodCallExpression)base.VisitMethodCallExpression(methodCallExpression); } if (newExpression != methodCallExpression && newExpression.Arguments.Any() && newExpression.Arguments[0].Type == typeof(ValueBuffer)) { return (_queryModelVisitor .BindMethodCallToValueBuffer(methodCallExpression, newExpression.Arguments[0]) ?? newExpression); } return(_queryModelVisitor .BindMethodCallExpression( methodCallExpression, (property, _) => Expression.Call( _getValueMethodInfo.MakeGenericMethod(newExpression.Method.GetGenericArguments()[0]), EntityQueryModelVisitor.QueryContextParameter, newExpression.Arguments[0], Expression.Constant(property))) ?? newExpression); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> protected override Expression VisitMethodCall(MethodCallExpression node) { var newExpression = base.VisitMethodCall(node); _queryModelVisitor .BindMethodCallExpression( node, (property, querySource) => { if (querySource != null) { _querySources[querySource]--; } }); return(newExpression); }
protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) { Check.NotNull(methodCallExpression, nameof(methodCallExpression)); var newExpression = base.VisitMethodCall(methodCallExpression); _queryModelVisitor .BindMethodCallExpression( methodCallExpression, (property, querySource) => { if (querySource != null) { _querySources[querySource]--; } }); return(newExpression); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) { MethodCallExpression newExpression = null; Expression firstArgument = null; if (methodCallExpression.Method.IsEFPropertyMethod()) { var newArguments = VisitAndConvert( new List <Expression> { methodCallExpression.Arguments[0], methodCallExpression.Arguments[1] }.AsReadOnly(), "VisitMethodCall"); if (newArguments[0].Type == typeof(ValueBuffer)) { firstArgument = newArguments[0]; // Compensate for ValueBuffer being a struct, and hence not compatible with Object method newExpression = Expression.Call( methodCallExpression.Method, Expression.Convert(newArguments[0], typeof(object)), newArguments[1]); } } if (newExpression == null) { newExpression = (MethodCallExpression)base.VisitMethodCall(methodCallExpression); } firstArgument = firstArgument ?? newExpression.Arguments.FirstOrDefault(); if (newExpression != methodCallExpression && firstArgument?.Type == typeof(ValueBuffer)) { return (_queryModelVisitor .BindMethodCallToValueBuffer(methodCallExpression, firstArgument) ?? newExpression); } return(_queryModelVisitor .BindMethodCallExpression <Expression>( methodCallExpression, (property, _) => { var propertyType = newExpression.Method.GetGenericArguments()[0]; if (newExpression.Arguments[0] is ConstantExpression maybeConstantExpression) { return Expression.Constant( property.GetGetter().GetClrValue(maybeConstantExpression.Value), propertyType); } if (newExpression.Arguments[0] is MethodCallExpression maybeMethodCallExpression && maybeMethodCallExpression.Method.IsGenericMethod && maybeMethodCallExpression.Method.GetGenericMethodDefinition() .Equals(DefaultQueryExpressionVisitor.GetParameterValueMethodInfo) || newExpression.Arguments[0].NodeType == ExpressionType.Parameter && !property.IsShadowProperty) { // The target is a parameter, try and get the value from it directly. return Expression.Call( _getValueFromEntityMethodInfo .MakeGenericMethod(propertyType), Expression.Constant(property.GetGetter()), newExpression.Arguments[0]); } return Expression.Call( _getValueMethodInfo.MakeGenericMethod(propertyType), EntityQueryModelVisitor.QueryContextParameter, newExpression.Arguments[0], Expression.Constant(property)); })