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

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

DDD
リリース: 2025-01-31 05:56:10
オリジナル
1002 人が閲覧しました

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

の2つのc#式Expression<Func<bool>>を組み合わせる方法を示しています。 パラメーターの不一致により、expr1 AND expr2のようなオペレーターを直接使用することは間違っています。 それぞれが異なるシナリオに対処しているいくつかのアプローチが提示されています。

メソッド1:単純な組み合わせ(同一のパラメーター)

両方の式が同じパラメーターを使用している場合、簡単なアプローチは、式式の本体でExpression.AndAlsoまたはExpression.OrElseを直接使用することです。

var body = Expression.AndAlso(expr1.Body, expr2.Body);
var lambda = Expression.Lambda<Func<bool>>(body, expr1.Parameters[0]);
ログイン後にコピー
否定も同様に単純です:

static Expression<Func<bool>> Not<T>(this Expression<Func<bool>> expr)
{
    return Expression.Lambda<Func<bool>>(Expression.Not(expr.Body), expr.Parameters[0]);
}
ログイン後にコピー

メソッド2:invoke を使用して、式を異なるパラメーターと組み合わせる

式のパラメーターが異なる場合、

メソッドを使用して、共通のパラメーターを使用して新しいラムダ式を作成できます。 Invoke

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;
}
ログイン後にコピー
は類似しており、

OrElseに置き換えられます AndAlsoOrElseメソッド3:最適化された組み合わせ(同一のパラメーターと異なるパラメーターを処理)<

このメソッドは、パラメーターが同じである場合、より単純なアプローチをインテリジェントに選択します。

メソッド4:ExpressionVisitorを使用したEFセーフアプローチ(.NET 4.0以降)< エンティティフレームワークの互換性の場合、

は堅牢なソリューションを提供します。

Invokeこのメソッドは、式内のパラメーター参照を置き換えて、さまざまなLINQプロバイダーとの互換性を確保します。 メソッドの選択は、アプリケーションの特定のニーズとコンテキスト、特に使用されるLINQプロバイダー、およびパラメーターの一貫性が保証されているかどうかに依存します。

アプローチは、複雑なシナリオとエンティティフレームワークの統合に最も堅牢なソリューションを提供します。
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);
}
ログイン後にコピー

以上がC#のオペレーターを使用して、または使用しない2つの表現式を組み合わせるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート