in src/Epam.GraphQL/Helpers/ExpressionHelpers.cs [180:251]
public static bool TryFactorizeCondition<T1, T2>(Expression<Func<T1, T2, bool>> expression, [NotNullWhen(true)] out ConditionFactorizationResult<T2>? result)
{
var factorizationResult = Factorize(expression);
if (factorizationResult.LeftExpressions.Count == 1 && factorizationResult.RightExpressions.Count != 0)
{
var leftExpression = factorizationResult.LeftExpressions[0];
LambdaExpression? rightExpression = null;
Expression<Func<T2, bool>>? rightCondition = null;
var operands = GetAndAlsoExpressions(factorizationResult.Expression.Body);
var parameters = factorizationResult.Expression.Parameters;
var leftParam = parameters[0];
var equalOperand = operands.Single(op => op.ContainsParameter(leftParam));
if (equalOperand.NodeType == ExpressionType.Equal)
{
var index = -1;
for (int i = 0; i < parameters.Count - 1; i++)
{
if (equalOperand.ContainsParameter(parameters[i + 1]))
{
index = i;
break;
}
}
if (index != -1)
{
var rightExpressions = factorizationResult.RightExpressions;
Expression? left = null;
var param = Expression.Parameter(typeof(T2));
for (int i = 0; i < rightExpressions.Count; i++)
{
if (i != index)
{
var right = ParameterRebinder<Expression, ParameterExpression>.ReplaceParameter(rightExpressions[i].Body, rightExpressions[i].Parameters[0], param);
if (left == null)
{
left = right;
continue;
}
left = Expression.AndAlso(left, right);
}
else
{
rightExpression = rightExpressions[i];
}
}
if (left != null)
{
rightCondition = Expression.Lambda<Func<T2, bool>>(left, param);
}
if (rightExpression != null)
{
result = new ConditionFactorizationResult<T2>(leftExpression, rightExpression, rightCondition);
return true;
}
}
}
}
result = null;
return false;
}