7 votes

Mise en œuvre d'un fournisseur LINQ-to-X personnalisé

J'ai un outil de recherche qui prend une chaîne de recherche complexe (en fait, un graphe d'objets à n niveaux en JSON) et renvoie des résultats. Je souhaite exposer cette fonctionnalité à d'autres développeurs (internes) par le biais d'un mécanisme de type LINQ.

En supposant que chaque résultat soit défini par une classe Result

Je peux créer des méthodes qui ressemblent à quelque chose comme :

Function Search(Expression As Linq.Expression(Of System.Func(Of Result, Boolean))) As IEnumerable(Of Result)

Ce que je ne sais pas, c'est comment je peux suivre cette voie. Expression et extraire les critères réels que je peux ensuite intégrer dans le graphe d'objets pour exécuter ma requête.

Quelqu'un peut-il m'indiquer un tutoriel/exemple de la manière dont cela peut être réalisé ?

Pour la petite histoire, j'ai réussi à creuser l'expression suffisamment loin pour obtenir la structure récursive et je suis en mesure d'examiner l'élément .Body d'expressions lambda, mais lorsque j'en arrive à vouloir gérer les Left y Right propriétés d'un nœud de type eg ExpressionType.Or J'ai des problèmes. Le débogueur utilise une classe de type Friend-scoped ( BinaryExpressionProxy ) pour examiner l'expression, ce qui n'est pas le cas pour moi.

8voto

luksan Points 4063

Vous pouvez envisager de créer une sous-classe de l'élément Visiteur d'expression classe. Elle fournit le mécanisme permettant de parcourir l'arbre d'expression, tout ce que vous avez à faire étant de surcharger les méthodes pour traiter chaque type de nœud.

Voici d'autres liens qui pourraient vous être utiles :

4voto

mcintyre321 Points 5393

Vous pouvez essayer d'utiliser un projet que j'ai écrit et qui s'appelle LinqToAnything que vous pouvez utiliser pour envelopper les sources de données afin d'exposer un IQueryable, en fonction de vos besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X