Serializar y deserializar árboles de expresión en C #

92

¿Hay alguna manera de deserializar expresiones en C #? Me gustaría almacenar expresiones en una base de datos y cargarlas en tiempo de ejecución.

Alexandre Brisebois
fuente
que tipo de expresiones? ¿Regex?
Jon Limjap
16
Asumiría expresiones de tipo System.Linq.Expression, dados los "árboles".
David Wengier
1
puede utilizar codeproject.com/Articles/851187/…
Mohammad Dayyan

Respuestas:

48

Continué trabajando en la biblioteca que se mencionó en Serializar y deserializar árboles de expresión en C #

Parece que el proyecto fue abandonado (2008) pero trabajé un poco en él y ahora funciona con .NET 4.0 y Silverlight. Hice correcciones de errores en su código y también lo hice más independiente de DAL.

http://expressiontree.codeplex.com/

T. Webster
fuente
2
+1 por encontrar una solución funcional. Intenté usar la biblioteca original en MSDN y no pude deserializar un nodo de expresión binaria simple. Tu proyecto funciona muy bien. ¡Gracias!
Jacobs Data Solutions
2
¿Es un proyecto en Nuget?
Mohammad Dayyan
@MohammadDayyan, Microsoft ha sido indeciso e inconsistente con su herramienta de administración de paquetes. A veces, los paquetes ASP.NET CORE se pueden instalar con Nuget, en otros casos, por ejemplo, un controlador MongoDB no estará disponible a través de NuGet. Aún así, al menos Microsoft tenía la información necesaria para permitir que NPM administrara paquetes. Es más probable que ponga esto en NPM
T. Webster
@RepoMan vale mucho más para mí resolver un problema cuando ayuda a alguien. Quizás pueda contribuir con alguna documentación sobre el uso, hablemos ...
T. Webster
14

Otra opción es el proyecto Expression Tree Serialization en code.msdn.com: ¿parece que hay más de lo que se necesita aquí?

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

Rico
fuente
El código de serialización de árbol de expresión se elimina de la galería de códigos code.msdn.microsoft.com/exprserialization , ¿alguna idea de dónde se mueve o mejores alternativas?
Kiran Bheemarti
@Kiran: ¿Qué quieres decir? La descarga del código todavía está ahí; revisa la pestaña de descargas en la parte superior de la página.
Robert Harvey
Sí, es ahora, probablemente algo temporal, la página arrojaba un error de proyecto no encontrado ayer cuando probé el enlace de arriba. Veo el proyecto y lo descargo ahora. ¡¡¡Gracias!!!
Kiran Bheemarti
13

Hay un proyecto en GitHub / Nuget llamado MetaLinq que tiene como objetivo facilitar el trabajo con los árboles de expresión.

Convierte entre expresiones normales y 'expresiones editables' que son mutables y totalmente serializables, por lo que se puede usar con Json, Xml, Binary, etc.

También consulte esta publicación de blog para obtener más información.

Pop Catalin
fuente
12

eche un vistazo a mi nueva biblioteca Serialize.Linq . Serializa expresiones linq en json, xml y binary.

esskar
fuente
has usado esto antes? ¿Cómo fue tu experiencia / encontraste limitaciones?
Alexandre Brisebois
Usé una versión similar en mi último proyecto. funciona bien.
esskar
¿Por qué escribirías algo que sangra peor las líneas entre niveles? Está promoviendo la exposición de los objetos de dominio DAL al BAL ... a menos que su biblioteca de alguna manera convierta automáticamente los DTO (y las consultas en su contra) en objetos / consultas de dominio. No veo nada en los documentos que indique tal comportamiento.
M.Babcock
@ M.Babcock: lo que quiere usar en sus expresiones DTO vs Entities no es parte de la lógica de la biblioteca.
esskar
4
@esskar tu blog / todo el sitio parece haber desaparecido. se ha movido?
Jon
3

No en su totalidad; sin embargo, el ejemplo de Dynamic LINQ puede ayudar un poco. Ciertamente, puede serializar una expresión en una cadena (hasta cierto punto, los genéricos parecen un poco chiflados), pero no hay un analizador incorporado.

Marc Gravell
fuente
No puedo averiguar cómo serializar una expresión en una cadena usando la muestra, solo en la otra dirección, para tomarla como cadena y crear un árbol de expresión. ¿A qué método llamo?
Christopher Edwards