この記事では、論理および、またはオペレーターではなく、
の2つのc#式Expression<Func<bool>>
を組み合わせる方法を示しています。 パラメーターの不一致により、expr1 AND expr2
のようなオペレーターを直接使用することは間違っています。 それぞれが異なるシナリオに対処しているいくつかのアプローチが提示されています。
メソッド1:単純な組み合わせ(同一のパラメーター)
両方の式が同じパラメーターを使用している場合、簡単なアプローチは、式式の本体でExpression.AndAlso
またはExpression.OrElse
を直接使用することです。
<code class="language-csharp">var body = Expression.AndAlso(expr1.Body, expr2.Body); var lambda = Expression.Lambda<Func<bool>>(body, expr1.Parameters[0]);</code>否定も同様に単純です:
<code class="language-csharp">static Expression<Func<bool>> Not<T>(this Expression<Func<bool>> expr) { return Expression.Lambda<Func<bool>>(Expression.Not(expr.Body), expr.Parameters[0]); }</code>
メソッド2:invoke を使用して、式を異なるパラメーターと組み合わせる
式のパラメーターが異なる場合、メソッドを使用して、共通のパラメーターを使用して新しいラムダ式を作成できます。
Invoke
<code class="language-csharp">static Expression<Func<bool>> AndAlso<T>(this Expression<Func<bool>> left, Expression<Func<bool>> right) { var param = Expression.Parameter(typeof(T), "x"); var body = Expression.AndAlso(Expression.Invoke(left, param), Expression.Invoke(right, param)); var lambda = Expression.Lambda<Func<bool>>(body, param); return lambda; }</code>は類似しており、
。OrElse
に置き換えられます
AndAlso
OrElse
メソッド3:最適化された組み合わせ(同一のパラメーターと異なるパラメーターを処理)このメソッドは、パラメーターが同じである場合、より単純なアプローチをインテリジェントに選択します。
メソッド4:ExpressionVisitorを使用したEFセーフアプローチ(.NET 4.0以降)は堅牢なソリューションを提供します。
Invoke
このメソッドは、式内のパラメーター参照を置き換えて、さまざまなLINQプロバイダーとの互換性を確保します。 メソッドの選択は、アプリケーションの特定のニーズとコンテキスト、特に使用されるLINQプロバイダー、およびパラメーターの一貫性が保証されているかどうかに依存します。
<code class="language-csharp">static Expression<Func<bool>> AndAlso<T>(this Expression<Func<bool>> expr1, Expression<Func<bool>> expr2) { ParameterExpression param = expr1.Parameters[0]; if (ReferenceEquals(param, expr2.Parameters[0])) { return Expression.Lambda<Func<bool>>(Expression.AndAlso(expr1.Body, expr2.Body), param); } return Expression.Lambda<Func<bool>>(Expression.AndAlso(expr1.Body, Expression.Invoke(expr2, param)), param); }</code>
以上がC#のオペレーターを使用して、または使用しない2つの表現式を組み合わせるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。