С# в Nutshell имеет свободный класс PredicateBuilder, который конструирует предикаты LINQ по частям, доступные здесь. Здесь выдержка из метода, который добавляет новое выражение в предикат. Может ли кто-нибудь объяснить это? (Я видел этот вопрос, я не хочу, чтобы там был общий ответ. Я ищу конкретное объяснение того, как Expression.Invoke и Expression.Lambda создают новое выражение).
public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
}