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!