Serializando e desserializando árvores de expressão em C #

92

Existe uma maneira de desserializar expressões em C #, gostaria de armazenar expressões em um banco de dados e carregá-los em tempo de execução.

Alexandre Brisebois
fonte
que tipo de expressões? Regex?
Jon Limjap
16
Eu assumiria expressões do tipo System.Linq.Expression, dadas as "árvores".
David Wengier,
1
você pode usar codeproject.com/Articles/851187/…
Mohammad Dayyan

Respostas:

48

Continuei trabalhando na biblioteca que foi mencionada por Serializing and Deserializing Expression Trees in C #

Parece que o projeto foi abandonado (2008), mas fiz alguns trabalhos nele e agora ele funciona com .NET 4.0 e Silverlight. Fiz correções de bugs em seu código e também o tornei mais independente de DAL.

http://expressiontree.codeplex.com/

T. Webster
fonte
2
1 para chegar a uma solução funcional. Tentei usar a biblioteca original no MSDN e não conseguiu desserializar um nó de expressão binária simples. Seu projeto funciona muito bem. Obrigado!
Jacobs Data Solutions
2
É um projeto no Nuget?
Mohammad Dayyan
@MohammadDayyan, a Microsoft tem sido indecisa e inconsistente em sua ferramenta de gerenciamento de pacotes. Às vezes, os pacotes ASP.NET CORE podem ser instalados com o Nuget; em outros casos, por exemplo, um driver MongoDB não estará disponível através do NuGet. Ainda assim, pelo menos a Microsoft teve o insight para permitir que o NPM gerencie pacotes. É mais provável colocar isso no NPM
T. Webster,
@RepoMan resolver um problema vale muito mais para mim quando ajuda alguém. Talvez você possa contribuir com alguma documentação sobre o uso - vamos conversar ..
T. Webster
14

Outra opção é o projeto Expression Tree Serialization em code.msdn.com - parece ser mais o que é necessário aqui?

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

Rico
fonte
O código de serialização da árvore de expressão foi removido da galeria de códigos code.msdn.microsoft.com/exprserialization , alguma ideia para onde ele é movido ou alternativas melhores?
Kiran Bheemarti
@Kiran: O que você quer dizer? O download do código ainda está lá; verifique a guia de downloads na parte superior da página.
Robert Harvey
Sim é agora, provavelmente uma coisa temporária, a página estava lançando um erro de projeto não encontrado ontem quando tentei o link acima. Eu vejo o projeto e faço o download agora. Obrigado!!!
Kiran Bheemarti
13

Existe um projeto no GitHub / Nuget chamado MetaLinq que visa tornar mais fácil trabalhar com árvores de expressão.

Ele converte entre Expressões normais e 'EditableExpressions' que são mutáveis ​​e totalmente serializáveis, então podem ser usadas com Json, Xml, Binary etc.

Verifique também esta postagem do blog para obter mais informações.

Pop Catalin
fonte
12

dê uma olhada em minha nova biblioteca Serialize.Linq . Ele serializa expressões linq para json, xml e binário.

Esskar
fonte
você já usou isso antes? como foi sua experiência / encontrou alguma limitação?
Alexandre Brisebois
usei uma versão semelhante em meu último projeto. funciona bem.
esskar
Por que você escreveria algo que sangra ainda mais as linhas entre as camadas? Você está promovendo a exposição de objetos de domínio DAL ao BAL ... a menos que sua biblioteca de alguma forma converta DTOs (e as consultas contra eles) em objetos / consultas de domínio. Não vejo nada nos documentos que indique tal comportamento.
M.Babcock
@ M.Babcock: o que você deseja usar em suas expressões DTO vs Entidades não faz parte da lógica da biblioteca.
esskar
4
@esskar seu blog / site inteiro parece ter desaparecido. mudou?
Jon
3

Não totalmente; no entanto, o exemplo Dynamic LINQ pode ajudar um pouco. Você certamente pode serializar uma expressão em uma string (até certo ponto - os genéricos parecem um pouco malucos), mas não há um analisador embutido.

Marc Gravell
fonte
Não consigo descobrir como serializar uma expressão em uma string usando o exemplo, apenas na outra direção, para tomar como string e criar uma árvore de expressão. Que método devo chamar?
Christopher Edwards,