Heim >Backend-Entwicklung >C++ >Wie kombinieren Sie logische Ausdrücke vom Typ 'Expression' in Linq?

Wie kombinieren Sie logische Ausdrücke vom Typ 'Expression' in Linq?

DDD
DDDOriginal
2025-01-31 06:01:09574Durchsuche

How to Combine Logical Expressions of Type `Expression` in LINQ?

Kombinieren Sie im LINQ den logischen Ausdruck des Typs

Expression<Func<bool>> lINQ verwendet häufig die Expression, die Expression ist eine Darstellung der Lambda -Expression. Bei der Verarbeitung von Ausdrücken werden häufig zwei logische Ausdrücke benötigt, z. B. und oder oder nicht.

Betrachten Sie beispielsweise die folgenden zwei Ausdrücke:

Möglicherweise möchten wir diese Ausdrücke kombinieren, um den gleichen neuen Ausdruck zu erhalten:

<code class="language-csharp">Expression<Func<bool>> expr1;
Expression<Func<bool>> expr2;</code>

Der Ausdruck der Kombination mit denselben Parametern

<code class="language-csharp">// 示例用法(原样无效)
Expression<Func<bool>> andExpression = expr1 AND expr2;</code>

Wenn und die gleichen Parameter verwenden, ist die Operation sehr einfach:

Der Ausdruck verschiedener Parameter mit einer Kombination expr1 expr2

Wenn der Ausdruck jedoch unterschiedliche Parameter verwendet, müssen wir darauf achten, wie sie kombiniert werden. Verwenden Sie , um dies zu erreichen:
<code class="language-csharp">var body = Expression.AndAlso(expr1.Body, expr2.Body);
var lambda = Expression.Lambda<Func<bool>>(body, expr1.Parameters[0]);</code>

Allgemeine Methode

Das folgende Codefragment bietet eine gemeinsame Methode, um den am besten geeigneten Weg zu bestimmen, um den Kombinationsausdruck zu bestimmen: 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>
Andere Vorsichtsmaßnahmen

In .NET 4.0 und höhere Versionen können Sie

Klasse verwenden, um EF -Sicherheitsausdrücke zu erstellen:

<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>
Diese Revision Output hält das Originalbild und liefert eine bessere und lesbare Erklärung der Code -Snippets, um eine bessere Lesbarkeit zu erhalten

Das obige ist der detaillierte Inhalt vonWie kombinieren Sie logische Ausdrücke vom Typ 'Expression' in Linq?. 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