Sérialisation et désérialisation des arborescences d'expressions en C #

92

Existe-t-il un moyen de désérialiser les expressions en C #, je voudrais stocker des expressions dans une base de données et les charger au moment de l'exécution.

Alexandre Brisebois
la source
quel genre d'expressions? Regex?
Jon Limjap
16
Je suppose que les expressions de type System.Linq.Expression, étant donné les "arbres".
David Wengier
1
vous pouvez utiliser codeproject.com/Articles/851187/…
Mohammad Dayyan

Réponses:

48

J'ai continué à travailler sur la bibliothèque mentionnée par la sérialisation et la désérialisation des arbres d'expressions en C #

Il semble que le projet ait été abandonné (2008) mais j'ai travaillé dessus et il fonctionne maintenant avec .NET 4.0 et Silverlight. J'ai corrigé leur code et l'ai rendu plus indépendant de DAL.

http://expressiontree.codeplex.com/

T. Webster
la source
2
+1 pour trouver une solution de travail. J'ai essayé d'utiliser la bibliothèque d'origine sur MSDN et je n'ai pas pu désérialiser un simple nœud d'expression binaire. Votre projet fonctionne très bien. Merci!
Jacobs Data Solutions
2
Est-ce un projet sur Nuget?
Mohammad Dayyan
@MohammadDayyan, Microsoft a été indécis et incohérent sur son outil de gestion de paquets. Parfois, les packages ASP.NET CORE peuvent être installés avec Nuget, dans d'autres cas, par exemple, un pilote MongoDB ne sera pas disponible via NuGet. Au moins, Microsoft avait au moins la capacité d'autoriser NPM à gérer les packages. Plus susceptibles de mettre cela sur NPM
T. Webster
@RepoMan résoudre un problème vaut tellement plus pour moi quand cela aide quelqu'un. Peut-être que vous pouvez contribuer à la documentation sur l'utilisation - parlons-en ..
T. Webster
14

Une autre option est le projet de sérialisation de l'arbre d'expression sur code.msdn.com - semble-t-il être plus ce qui est nécessaire ici?

UPD: maintenant http://archive.msdn.microsoft.com/exprserialization

Riches
la source
Le code de sérialisation de l'arborescence d'expression est supprimé de la galerie de codes code.msdn.microsoft.com/exprserialization , une idée de l'endroit où il est déplacé ou de meilleures alternatives?
Kiran Bheemarti
@Kiran: Que voulez-vous dire? Le téléchargement de code est toujours là; consultez l'onglet téléchargements en haut de la page.
Robert Harvey
Oui c'est maintenant, probablement une chose temporaire, la page lançait une erreur de projet non trouvée hier lorsque j'ai essayé le lien ci-dessus. Je vois le projet et le télécharge maintenant. Merci!!!
Kiran Bheemarti
13

Il existe un projet sur GitHub / Nuget appelé MetaLinq qui vise à faciliter le travail avec l'expression tress.

Il convertit entre les expressions normales et les `` expressions éditables '' qui sont mutables et entièrement sérialisables, donc peuvent être utilisées avec Json, Xml, Binary, etc.

Consultez également cet article de blog pour plus d'informations.

Pop Catalin
la source
12

jetez un œil à ma nouvelle bibliothèque Serialize.Linq . Il sérialise les expressions linq en json, xml et binary.

esskar
la source
avez-vous déjà utilisé cela? comment a été votre expérience / trouver des limites?
Alexandre Brisebois
J'en ai utilisé une version similaire dans mon dernier projet. fonctionne bien.
esskar
Pourquoi écririez-vous quelque chose qui saigne les lignes entre les niveaux? Vous faites la promotion de l'exposition des objets de domaine DAL au BAL ... à moins que votre bibliothèque ne convertisse automatiquement les DTO (et les requêtes les concernant) en objets / requêtes de domaine. Je ne vois rien dans la documentation indiquant un tel comportement.
M.Babcock
@ M.Babcock: ce que vous voulez utiliser dans vos expressions DTO vs Entities ne fait pas partie de la logique de la librairie.
esskar
4
@esskar votre blog / site entier semble avoir disparu. a-t-il bougé?
Jon
3

Pas en entier; cependant, l'exemple Dynamic LINQ peut aider un peu. Vous pouvez certainement sérialiser une expression en une chaîne (dans une certaine mesure - les génériques semblent un peu vicieux), mais il n'y a pas d'analyseur intégré.

Marc Gravell
la source
Je ne peux pas trouver comment sérialiser une expression en une chaîne à l'aide de l'exemple, uniquement dans l'autre sens, pour la prendre comme chaîne et créer un arbre d'expression. Quelle méthode dois-je appeler?
Christopher Edwards le