Maison >développement back-end >C++ >Comment combiner des expressions logiques dans l'expression C #?

Comment combiner des expressions logiques dans l'expression C #?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-31 05:51:081049parcourir

How to Combine Logical Expressions in C# Expression?

Dans l'expression C #, combinez l'expression logique

Lorsque vous avez deux expressions de type

, vous devrez peut-être utiliser des opérateurs logiques (tels que et, ou ou non) pour les combiner. Cet article traite de diverses méthodes pour atteindre cet objectif.

Expression<Func<bool>> La même instance de paramètre

Si les deux expressions utilisent le même , la combinaison est simple:

ParameterExpression Ceci est également applicable à nier une seule opération:

<code class="language-csharp">var body = Expression.AndAlso(expr1.Body, expr2.Body);
var lambda = Expression.Lambda<Func<bool>>(body, expr1.Parameters[0]);</code>

différents exemples de paramètres

<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>

Si l'expression utilise différentes instances de paramètres, vous pouvez utiliser pour combiner:

Cette méthode est également applicable à Invoke et

.
<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>

Méthode générale OrElse Not

Afin de gérer ces deux situations, une méthode générale peut détecter les paramètres correspondent et sélectionner la méthode de combinaison appropriée:

compatibilité EF

du .NET 4.0,
<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>
a fourni un mécanisme pour construire une expression compatible EF:

En sélectionnant une méthode cohérente avec votre scène spécifique, vous pouvez combiner efficacement l'expression logique dans l'instance

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn