public LambdaExpression Rewrite()

in src/Epam.GraphQL/Configuration/Implementations/ProxyAccessor.cs [169:201]


        public LambdaExpression Rewrite(LambdaExpression expression, LambdaExpression originalExpression)
        {
            var param = Expression.Parameter(ProxyType);
            var unaryExpr = expression.Body as UnaryExpression;

            if (unaryExpr != null
                && (expression.Body.NodeType == ExpressionType.Convert || expression.Body.NodeType == ExpressionType.ConvertChecked || expression.Body.NodeType == ExpressionType.TypeAs))
            {
                expression = Expression.Lambda(unaryExpr.Operand, expression.Parameters);
            }

            if (_expressionNames.TryGetValue(expression, out var originalExpressionName))
            {
                var propInfo = ProxyType.GetProperty(originalExpressionName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                var member = Expression.Property(param, propInfo);
                Expression expr = unaryExpr != null
                    ? Expression.MakeUnary(unaryExpr.NodeType, member, unaryExpr.Type)
                    : member;

                var result = Expression.Lambda(expr, param);
                return result;
            }

            var fieldName = Fields.OfType<IExpressionFieldConfiguration<TEntity, TExecutionContext>>()
                .FirstOrDefault(field => ExpressionEqualityComparer.Instance.Equals(originalExpression, field.OriginalExpression))
                ?.Name;

            Guards.AssertType<TEntity>(fieldName == null);

            var fieldMember = Expression.Property(param, ProxyType.GetProperty(fieldName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase));
            var fieldResult = Expression.Lambda(fieldMember, param);
            return fieldResult;
        }