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
Patricia Arquetteoriginal
2025-01-31 05:46:08536parcourir

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>

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

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>

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>

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!

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