Créer des requêtes OU dynamiques à l'aide de LINQ to Entities
Dans LINQ to Entities, il est très courant de créer des requêtes dynamiques en utilisant une exécution différée. Cependant, ces requêtes utilisent généralement AND pour connecter les conditions WHERE.
Pour implémenter la logique OU, c'est-à-dire rechercher plusieurs propriétés à l'aide d'un seul identifiant, vous pouvez tirer parti du PredicateBuilder de LINQKit. Cela vous permet de construire des prédicats dynamiquement :
<code class="language-csharp">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();</code>
Expand()
est cruciale car Entity Framework ne peut pas gérer les expressions d'appel. En l'appelant, vous activez la classe d'accesseur d'expression de LINQKit, qui remplace ces expressions par des structures plus simples comprises par Entity Framework.
Sans Expand()
, l'expression est invoquée, ce qui entraîne l'exception : "Le type de nœud d'expression LINQ 'Invoke' n'est pas pris en charge dans LINQ to Entities
Un autre générateur de prédicats
Plus tard, un générateur de prédicats général a été développé et peut effectuer la même tâche sans Expand()
:
https://www.php.cn/link/451e10de8e2fb18a9f795679b52dc9f6
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!