Clause where dynamic (OR) dans Linq to Entities

Dans le post ici, j’ai appris à créer une requête dynamic à l’aide de l’exécution différée de Linq. Mais la requête utilise en réalité une concaténation AND de la condition WHERE.

Comment puis-je réaliser la même requête mais avec une logique OR?

En raison de l’énumération Flags, la requête doit rechercher Username , WindowsUsername ou les deux :

public User GetUser(IdentifierType type, ssortingng identifier) { using (var context = contextFactory.Invoke()) { var query = from u in context.Users select u; if (type.HasFlag(IdentifierType.Username)) query = query.Where(u => u.Username == identifier); if (type.HasFlag(IdentifierType.Windows)) query = query.Where(u => u.WindowsUsername == identifier); return query.FirstOrDefault(); } } 

Avec PredicateBuilder de LINQKit, vous pouvez créer des prédicats de manière dynamic .

 var query = from u in context.Users select u; var pred = Predicate.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); return query.Where(pred.Expand()).FirstOrDefault(); // or return query.AsExpandable().Where(pred).FirstOrDefault(); 

C’est à cela que sert Expand :

Le pipeline de traitement de requêtes d’Entity Framework ne peut pas gérer les expressions d’appel. C’est pourquoi vous devez appeler AsExpandable sur le premier object de la requête. En appelant AsExpandable, vous activez la classe de visiteur d’expression de LINQKit qui substitue les expressions d’invocation par des constructions plus simples pouvant être comsockets par Entity Framework.

Ou: sans elle, une expression est Invoke d, ce qui provoque une exception dans EF:

Le type de noeud d’expression LINQ ‘Invoke’ n’est pas pris en charge dans LINQ to Entities.

Ajout ultérieur:

Il existe un constructeur de prédicat alternatif qui fait la même chose mais sans Expand: http://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/

Cela devrait aider ..

Contient une requête sur plusieurs colonnes

Il semble également qu’il existe un problème fondamental dans la conception de la table (corrigez-moi si je me trompe). Quel est le but de IdentifierType dans votre firebase database?