ホームページ >バックエンド開発 >C++ >C#のオペレーターを使用して、または使用しない2つの表現式を組み合わせるにはどうすればよいですか?

C#のオペレーターを使用して、または使用しない2つの表現式を組み合わせるにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-31 05:56:10945ブラウズ

この記事では、論理および、またはオペレーターではなく、

の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に置き換えられます AndAlsoOrElseメソッド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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。