Maison >développement back-end >C++ >Comment puis-je créer une requête OU dynamique avec LINQ to Entities ?

Comment puis-je créer une requête OU dynamique avec LINQ to Entities ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-22 04:56:13814parcourir

How Can I Create a Dynamic OR Query with LINQ to Entities?

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>
La méthode

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!

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