Heim >Backend-Entwicklung >C++ >Wie kombinieren Sie zwei Expressionsausdrücke mit logischen Operatoren?

Wie kombinieren Sie zwei Expressionsausdrücke mit logischen Operatoren?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-31 05:46:08538Durchsuche

How to Combine Two Expression Expressions Using Logical Operators?

zwei Kombinationsexpressionen (Expression

)

Im Bereich der Datenoperation müssen Sie möglicherweise die beiden Ausdrucksausdrücke mit logischen Operatoren verwenden (z. B. und, oder oder nicht).

Herausforderung Die folgenden Codefragmente veranschaulichen die Herausforderungen, mit denen Sie sich stellen können:

Lösung

Um die beiden Ausdrücke logischer Operatoren zu verwenden, können Sie die folgenden Methoden auswählen:

<code>Expression<func bool="">> expr1;
Expression<func bool="">> expr2;

...

// 这不会按预期工作
Expression<func bool="">> andExpression = expr1 AND expr2;</code>
Methode 1: Die gleiche Parameterexpression

Wenn Sie dieselbe Parameterexpression in Expr1 und expr2 verwenden, können Sie einfach ihren Text kombinieren und den ursprünglichen Parameter verwenden, um einen neuen Lambda -Ausdruck zu erstellen.

Diese Methode ist auch anwendbar, um einen einzelnen Ausdruck zu negieren:

Methode 2: verschiedene Parameterexpressions
<code>var body = Expression.AndAlso(expr1.Body, expr2.Body);
var lambda = Expression.Lambda<func bool="">(body, expr1.Parameters[0]);</code>

Wenn zwei Ausdrücke unterschiedliche Parameterexpression -Instanzen verwenden, können Sie INVOKE verwenden, um sie zu kombinieren:

<code>static Expression<func bool=""> Not<T>(
    this Expression<func bool=""> expr)
{
    return Expression.Lambda<func bool="">(
        Expression.Not(expr.Body), expr.Parameters[0]);
}</code>

Diese Methode ist für und und oder Operationen geeignet.

Methode 3: Allgemeine Version

<code>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>
Diese Version erkennt automatisch, ob die beiden Ausdrücke dieselben Parameter verwenden und den Ausdruck entsprechend anpassen:

Verwenden Sie Expressionsvisor

Für .NET 4.0 und höhere Versionen können Sie die Expressionsvisitor -Klasse verwenden, um einen EF -Sicherheitsausdruck zu erstellen. Mit dieser Methode können Sie den ursprünglichen Parameter durch die Anzahl der neuen Parameter ohne explizite Konvertierung ersetzen:

<code>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);
    }
    // 否则,使用 Invoke 来组合
    return Expression.Lambda<func bool="">(
        Expression.AndAlso(
            expr1.Body,
            Expression.Invoke(expr2, param)), param);
}</code>

Mit diesen Methoden können Sie verschiedene logische Ausdrücke nahtlos kombinieren und komplexe Abfragevorgänge für Ihre Daten ausführen.

Das obige ist der detaillierte Inhalt vonWie kombinieren Sie zwei Expressionsausdrücke mit logischen Operatoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn