protected override Expression VisitBinary(BinaryExpression node) { var ignoreAtStart = _ignore; _ignore = _ignore || node.NodeType == ExpressionType.OrElse; if (!_ignore) { var leftParams = ParameterExtractor.ExtractParameters(node.Left); var rightParams = ParameterExtractor.ExtractParameters(node.Right); if (( (!_isNot && node.NodeType == ExpressionType.Equal) || (_isNot && node.NodeType == ExpressionType.NotEqual) ) && AreParametersCorrect(leftParams, rightParams)) { AddKeysToList(node, leftParams, rightParams); _expression = _expression == null ? node : Expression.AndAlso(_expression, node); } } var returnVal = base.VisitBinary(node); if (!ignoreAtStart && _ignore) { _ignore = false; } return(returnVal); }
public static HashSet <ParameterExpression> ExtractParameters(Expression expr) { var l = new ParameterExtractor(); l.Visit(expr); return(l._parameters); }