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