Maison > développement back-end > C++ > Comment combiner des expressions logiques de type «Expression» dans LINQ?

Comment combiner des expressions logiques de type «Expression» dans LINQ?

DDD
Libérer: 2025-01-31 06:01:09
original
520 Les gens l'ont consulté

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

Dans le linq, combinez l'expression logique du type

Expression<Func<bool>> linq utilise souvent l'expression, l'expression est une représentation de l'expression de lambda. Lors du traitement des expressions, deux expressions logiques sont souvent nécessaires, telles que et, ou non.

Par exemple, considérez les deux expressions suivantes:

Nous pouvons vouloir combiner ces expressions pour obtenir le même type de nouvelle expression:

<code class="language-csharp">Expression<Func<bool>> expr1;
Expression<Func<bool>> expr2;</code>
Copier après la connexion

l'expression de la combinaison avec les mêmes paramètres

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

Si et utilisent les mêmes paramètres, l'opération est très simple:

L'expression de différents paramètres avec une combinaison expr1 expr2

Cependant, si l'expression utilise différents paramètres, nous devons faire attention à la façon de les combiner. Utilisez pour y parvenir:
<code class="language-csharp">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 générale

Le fragment de code suivant fournit une méthode courante pour déterminer la manière la plus appropriée de déterminer l'expression combinée: 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>
Copier après la connexion
Autres précautions

Dans .NET 4.0 et des versions supérieures, vous pouvez utiliser la classe

pour créer des expressions de sécurité EF:

<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>
Copier après la connexion
Cette sortie révocée maintient l'image d'origine et fournit une explication plus concise et lisible des extraits de code.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal