コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        /// <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));
            })