ラムダ式の問題は、それらが不変であり、ラムダのパラメーターを簡単に置き換えることができないことです。私の最初のアイデアは、次のようなことをすることでした(残念ながら、これはうまくいきません):
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");
考えられる解決策
式ビルダーの実装を目的としたプロジェクトの 1 つを使用してみることができます。私はそれらのいずれも使用していませんが、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");