Création de requêtes LINQ to Entities dynamiques avec des conditions OR
La création de requêtes LINQ dynamiques nécessite souvent de combiner plusieurs clauses WHERE. Alors que LINQ standard gère facilement les conditions AND, la construction de conditions OR dynamiques présente un défi. Cet article présente une solution utilisant PredicateBuilder
de LINQKit pour y parvenir.
La clé est d'exploiter PredicateBuilder
pour une création flexible de prédicats et d'assurer la compatibilité avec Entity Framework. Le code suivant illustre cette approche :
<code class="language-csharp">var query = from u in context.Users select u; var pred = PredicateBuilder.False<User>(); // Start with a predicate that's always false if (type.HasFlag(IdentifierType.Username)) pred = pred.Or(u => u.Username == identifier); if (type.HasFlag(IdentifierType.Windows)) pred = pred.Or(u => u.WindowsUsername == identifier); // Corrected parenthesis return query.Where(pred.Expand()).FirstOrDefault(); // or return query.AsExpandable().Where(pred).FirstOrDefault();</code>
Surtout, notez l'utilisation de pred.Expand()
ou query.AsExpandable()
. Ceci est essentiel car PredicateBuilder
crée des expressions que Entity Framework ne prend pas directement en charge. Expand()
(ou AsExpandable()
) utilise le visiteur d'expression de LINQKit pour traduire ces expressions dans un formulaire compatible avec Entity Framework, empêchant ainsi les exceptions.
Comme alternative, envisagez d'explorer d'autres PredicateBuilder
implémentations, comme celle de Peter Montgomery (https://www.php.cn/link/451e10de8e2fb18a9f795679b52dc9f6), qui pourraient offrir des fonctionnalités similaires sans nécessitant l'appel explicite Expand()
. Cela fournit une approche rationalisée pour construire des conditions OU dynamiques dans vos requêtes LINQ to Entities.
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!