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