Maison >développement back-end >C++ >Comment puis-je implémenter efficacement la logique OR dans une clause LINQ WHERE dynamique ?

Comment puis-je implémenter efficacement la logique OR dans une clause LINQ WHERE dynamique ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-22 05:06:09595parcourir

How Can I Efficiently Implement OR Logic in a Dynamic LINQ WHERE Clause?

Utilisez LINQKit pour améliorer la logique OU de la clause WHERE dynamique

L'article précédent a présenté une méthode pour créer des requêtes dynamiques à l'aide de l'exécution retardée LINQ. Toutefois, cette requête utilise une condition AND pour joindre la clause WHERE. Cet article explique comment adapter cette méthode pour utiliser la logique OU à la place.

L'objectif spécifique est de créer une requête qui recherche les utilisateurs en fonction de leur nom d'utilisateur, de leur nom d'utilisateur Windows ou des deux (déterminés par l'énumération IdentifierType fournie). La méthode GetUser modifiée est la suivante :

<code>public User GetUser(IdentifierType type, string identifier)
{
    using (var context = contextFactory.Invoke())
    {
        var query = from u in context.Users select u;

        var pred = Predicate.False<User>();

        if (type.HasFlag(IdentifierType.Username))
            pred = pred.Or(u => u.Username == identifier);

        if (type.HasFlag(IdentifierType.Windows))
            pred = pred.Or(u => u.WindowsUsername == identifier);

        return query.Where(pred.Expand()).FirstOrDefault();
        // 或者 return query.AsExpandable().Where(pred).FirstOrDefault();
    }
}</code>

La clé de l'implémentation de la logique OU réside dans le PredicateBuilder de la bibliothèque LINQKit. Il permet la construction dynamique de prédicats et peut être utilisé conjointement avec Entity Framework. Les prédicats commencent par Predicate.False et sont modifiés dynamiquement en fonction de l'indicateur IdentifierType.

La méthode Expand() est cruciale car Entity Framework ne prend pas en charge les expressions d'appel. AsExpandable() active l'accesseur d'expression de LINQKit et convertit l'expression en un formulaire que Entity Framework peut gérer. Sans cela, une exception « Invoke » se produira.

Une autre approche consiste à utiliser le générateur de prédicats de Pete Montgomery, qui exécute la même fonctionnalité sans avoir besoin de Expand().

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