Maison > développement back-end > C++ > Comment combiner deux expressions d'expression à l'aide d'opérateurs logiques?

Comment combiner deux expressions d'expression à l'aide d'opérateurs logiques?

Patricia Arquette
Libérer: 2025-01-31 05:46:08
original
487 Les gens l'ont consulté

How to Combine Two Expression Expressions Using Logical Operators?

Deux expressions de combinaison (expression

)

Dans le domaine du fonctionnement des données, vous devrez peut-être utiliser les deux expressions d'expression

de type avec des opérateurs logiques (tels que et, ou non). Challenge

Les fragments de code suivants illustrent les défis auxquels vous pouvez faire face:

Solution

Pour utiliser les deux expressions d'opérateurs logiques, vous pouvez choisir les méthodes suivantes:
<code>Expression<func bool="">> expr1;
Expression<func bool="">> expr2;

...

// 这不会按预期工作
Expression<func bool="">> andExpression = expr1 AND expr2;</code>
Copier après la connexion

Méthode 1: la même paramètre de paramètre

Si vous utilisez la même paramètres de paramètres dans expr1 et expr2, vous pouvez simplement combiner leur texte et utiliser le paramètre d'origine pour créer une nouvelle expression Lambda.

Cette méthode s'applique également à une seule expression:

<code>var body = Expression.AndAlso(expr1.Body, expr2.Body);
var lambda = Expression.Lambda<func bool="">(body, expr1.Parameters[0]);</code>
Copier après la connexion
Méthode 2: Différentes paramètres de paramètres

Si deux expressions utilisent différentes instances de paramètres de paramètres, selon votre fournisseur LINQ, vous pouvez utiliser Invoke pour les combiner:
<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>
Copier après la connexion

Cette méthode convient aux opérations et / ou / ou.

Méthode 3: version générale
<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>
Copier après la connexion

Cette version détectera automatiquement si les deux expressions utilisent les mêmes paramètres et ajusteront l'expression en conséquence:

Utiliser ExpressionVisitor

Pour .NET 4.0 et des versions supérieures, vous pouvez utiliser la classe ExpressionVisitor pour créer une expression de sécurité EF. Cette méthode vous permet de remplacer le paramètre d'origine par le nombre de nouveaux paramètres sans conversion explicite:
<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>
Copier après la connexion

En utilisant ces méthodes, vous pouvez combiner de manière transparente diverses expressions logiques et effectuer des opérations de requête complexes sur vos données.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal