private static bool MatchEfPropertyToMemberExpression(MemberExpression memberExpression, MethodCallExpression methodCallExpression)
            {
                if (methodCallExpression.IsEFProperty())
                {
                    var propertyName = (string)((ConstantExpression)methodCallExpression.Arguments[1]).Value;

                    return(memberExpression.Member.Name.Equals(propertyName) &&
                           ExpressionEqualityComparer.Instance.Equals(memberExpression.Expression.RemoveConvert(), methodCallExpression.Arguments[0].RemoveConvert()));
                }

                return(false);
            }
Exemple #2
0
            protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression)
            {
                if (methodCallExpression.IsEFProperty() &&
                    methodCallExpression.Arguments[0] == _entityType.QueryFilter.Parameters[0] &&
                    (!(methodCallExpression.Arguments[1] is ConstantExpression constantExpression) ||
                     !(constantExpression.Value is string propertyName) ||
                     _entityType.FindNavigation(propertyName) != null))
                {
                    _valid = false;

                    return(methodCallExpression);
                }

                return(base.VisitMethodCall(methodCallExpression));
            }
Exemple #3
0
            protected override Expression VisitMethodCall(MethodCallExpression node)
            {
                if (node != null && node.IsEFProperty())
                {
                    var oldInsideEFProperty = _insideEFProperty;
                    _insideEFProperty = true;

                    var result = base.VisitMethodCall(node);

                    _insideEFProperty = oldInsideEFProperty;

                    return(result);
                }

                return(base.VisitMethodCall(node));
            }
Exemple #4
0
        /// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression)
        {
            if (!methodCallExpression.IsEFProperty())
            {
                _stringBuilder.Append(methodCallExpression.Method.ReturnType.ShortDisplayName() + " ");
            }

            if (methodCallExpression.Object != null)
            {
                if (methodCallExpression.Object is BinaryExpression)
                {
                    _stringBuilder.Append("(");
                    Visit(methodCallExpression.Object);
                    _stringBuilder.Append(")");
                }
                else
                {
                    Visit(methodCallExpression.Object);
                }

                _stringBuilder.Append(".");
            }

            _stringBuilder.Append(methodCallExpression.Method.Name + "(");

            var isSimpleMethodOrProperty = _simpleMethods.Contains(methodCallExpression.Method.Name) ||
                                           methodCallExpression.Arguments.Count < 2 ||
                                           methodCallExpression.IsEFProperty();

            var appendAction = isSimpleMethodOrProperty ? (Action <string>)Append : AppendLine;

            if (methodCallExpression.Arguments.Count > 0)
            {
                appendAction("");

                var argumentNames
                    = !isSimpleMethodOrProperty
                        ? methodCallExpression.Method.GetParameters().Select(p => p.Name).ToList()
                        : new List <string>();

                if (!isSimpleMethodOrProperty)
                {
                    var shouldPrintConnections = PrintConnections && !_nonConnectableMethods.Contains(methodCallExpression.Method.Name);
                    _stringBuilder.IncrementIndent(shouldPrintConnections);
                }

                for (var i = 0; i < methodCallExpression.Arguments.Count; i++)
                {
                    var argument = methodCallExpression.Arguments[i];

                    if (!isSimpleMethodOrProperty)
                    {
                        _stringBuilder.Append(argumentNames[i] + ": ");
                    }

                    if (i == methodCallExpression.Arguments.Count - 1 &&
                        !isSimpleMethodOrProperty)
                    {
                        _stringBuilder.DisconnectCurrentNode();
                    }

                    Visit(argument);

                    if (i < methodCallExpression.Arguments.Count - 1)
                    {
                        appendAction(", ");
                    }
                }

                if (!isSimpleMethodOrProperty)
                {
                    _stringBuilder.DecrementIndent();
                }
            }

            Append(")");

            return(methodCallExpression);
        }
Exemple #5
0
 protected override Expression VisitMethodCall(MethodCallExpression expression)
 => expression.IsEFProperty()
         ? Expression.Property(
     expression.Arguments[0].RemoveConvert(),
     Expression.Lambda <Func <string> >(expression.Arguments[1]).Compile().Invoke())
         : base.VisitMethodCall(expression);
 protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression)
 => methodCallExpression.IsEFProperty()
     ? methodCallExpression
     : base.VisitMethodCall(methodCallExpression);
        protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression)
        {
            if (methodCallExpression.Object != null)
            {
                if (methodCallExpression.Object is BinaryExpression)
                {
                    _stringBuilder.Append("(");
                    Visit(methodCallExpression.Object);
                    _stringBuilder.Append(")");
                }
                else
                {
                    Visit(methodCallExpression.Object);
                }

                _stringBuilder.Append(".");
            }

            _stringBuilder.Append(methodCallExpression.Method.Name);
            if (methodCallExpression.Method.IsGenericMethod)
            {
                _stringBuilder.Append("<");
                var first = true;
                foreach (var genericArgument in methodCallExpression.Method.GetGenericArguments())
                {
                    if (!first)
                    {
                        _stringBuilder.Append(", ");
                    }
                    _stringBuilder.Append(genericArgument.ShortDisplayName());
                    first = false;
                }

                _stringBuilder.Append(">");
            }
            _stringBuilder.Append("(");

            var isSimpleMethodOrProperty = _simpleMethods.Contains(methodCallExpression.Method.Name) ||
                                           methodCallExpression.Arguments.Count < 2 ||
                                           methodCallExpression.IsEFProperty();

            var appendAction = isSimpleMethodOrProperty ? (Action <string>)Append : AppendLine;

            if (methodCallExpression.Arguments.Count > 0)
            {
                appendAction("");

                var argumentNames
                    = !isSimpleMethodOrProperty
                        ? methodCallExpression.Method.GetParameters().Select(p => p.Name).ToList()
                        : new List <string>();

                if (!isSimpleMethodOrProperty)
                {
                    _stringBuilder.IncrementIndent();
                }

                for (var i = 0; i < methodCallExpression.Arguments.Count; i++)
                {
                    var argument = methodCallExpression.Arguments[i];

                    if (!isSimpleMethodOrProperty)
                    {
                        _stringBuilder.Append(argumentNames[i] + ": ");
                    }

                    Visit(argument);

                    if (i < methodCallExpression.Arguments.Count - 1)
                    {
                        appendAction(", ");
                    }
                }

                if (!isSimpleMethodOrProperty)
                {
                    _stringBuilder.DecrementIndent();
                }
            }

            Append(")");

            return(methodCallExpression);
        }