7
votes

Requête Dynamic Linq avec critères multiples / inconnus

Je cherche à mettre en place un système permettant à une utilisation des conditions "Création", puis renvoyez les données résultantes de la base de données. À l'heure actuelle, il existe une procédure stockée qui génère SQL à la volée et l'exécute. C'est un problème particulier que je veux supprimer.

Mon problème provient du fait que je peux avoir plusieurs domaines dans mes critères et pour chacun de ces champs, il pourrait y avoir une valeur de 1 ou plus, avec différents opérateurs potentiels . P>

Par exemple, P>

Formatted Condition For Email: Email="email1@domain.com"||Email="email2@domain.com"
Formatted Condition For Field1: Field1="Chris"


0 commentaires

3 Réponses :


1
votes

Je pense que Dynamic Linq sera une option. DLINQ vous permet de spécifier une partie de la requête LINQ en tant que "chaîne" et DLINQ compile ensuite cette chaîne à l'arborescence d'expression afin que celle-ci soit transmise au fournisseur LINQ sous-jacent. Votre besoin est aussi pareil que vous devez créer des arbres d'expression au moment de l'exécution.

Je vous suggère de faire la propriété de l'opérateur dans FieldCriteria en tant que Enum qui représente toutes les opérations requises (égale, moins ). Ensuite, vous devrez écrire une fonction qui prend une liste de FieldCriteria et renvoie une chaîne "Expression" qui peut ensuite être introduite dans DLINQ pour obtenir l'arborescence d'expression.


2 commentaires

Toute l'idée de "LINQ to " est de convertir des expressions de temps compilées C # statiques à une sorte de chaîne à envoyer à la base de données sous-jacente à l'exécution. Votre suggestion d'utiliser une chaîne à convertir en une expression linq à son tour convertie en une chaîne semble un peu redondante :)


Vous êtes correct sur l'expression "statique" à SQL, mais dans la question que l'utilisateur ne connaît pas l'expression à l'heure de la compilation et que vous devez donc générer des expressions au moment de l'exécution. DLINQ est un moyen de le faire à partir de "chaînes" et d'autre manière consiste à utiliser l'expression API pour créer les expressions requises au moment de l'exécution.



9
votes

Le truc avec Linq serait de construire une expression à partir des données. À titre d'exemple, illustrer l'exemple présenté: xxx

en particulier, noter comment andalso peut être utilisé pour composer les différentes opérations (identiques à plusieurs , mais plus simple).


3 commentaires

Le code ci-dessus ne nécessite-il pas de connaître les champs / critères / opérateur? Dans mon scénario. Aucun n'est connu au moment de la compilation et il doit être complètement dynamique à cet égard. Pardonne-moi que je me trompe alors que les fonctions de Lambda sont un peu hors de mes connaissances actuelles.


@Chris non, mais vous devrez écrire du code qui génère les expressions


Comment utiliser dans l'intérieur où la clause?



-2
votes

Ceci peut simplement être fait par LINQ où vous attachez des opérateurs supplémentaires à l'objet de requête. Voici un exemple.

query = db.Contacts.Where( ... );
 query = query.Where( ... );
 query = query.Where( ... );


1 commentaires

Ceci est pour et logique, mais qu'en est-il ou de la logique?