Проблема с лямбда-выражениями заключается в том, что они неизменны, и вы не можете легко заменить параметры лямбда-выражения. Моей первоначальной идеей было сделать что-то вроде этого ( к сожалению, это не сработает ):
public static class ExpressionExtesions
{
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> baseCondition, Expression<Func<T, bool>> additionalCondition)
{
var and = Expression.AndAlso(baseCondition.Body, additionalCondition.Body);
return Expression.Lambda<Func<T, bool>>(and, baseCondition.Parameters); // additionalCondition.Body still uses its own parameters so this fails on Compile()
}
}
и используйте в коде:
Expression<Func<User, bool>> e = usr => usr.IsActive && usr.Group != "PROCESS";
var e1 = e.And(u => u.Name != null);
var e2 = e.And(u => u.Name != "A");
var e3 = e.And(u => u.Name != "B");
Возможное решение
Вы можете попробовать использовать один из проектов, направленных на реализацию построителей выражений. Я не использовал ни одного из них, но Google дает много ссылок, например:
Другой подход
Если вы используете эти выражения в LINQ для фильтрации значений, вы можете использовать другой подход (не объединять выражения, а объединять фильтры):
var activeUsers = allUsers.Where(usr => usr.IsActive && usr.Group != "PROCESS");
var usersAll = activeUsers.Where(u => u.Name != null);
var usersNotA = activeUsers.Where(u => u.Name != "A");
var usersNotB = activeUsers.Where(u => u.Name != "B");