Serializacja i deserializacja drzew wyrażeń w języku C #

92

Czy istnieje sposób na deserializację wyrażeń w C #, chciałbym przechowywać wyrażenia w bazie danych i ładować je w czasie wykonywania.

Alexandre Brisebois
źródło
jakiego rodzaju wyrażenia? Regex?
Jon Limjap
16
Zakładałbym wyrażenia typu System.Linq.Expression, biorąc pod uwagę "drzewa".
David Wengier
1
możesz użyć codeproject.com/Articles/851187/…
Mohammad Dayyan

Odpowiedzi:

48

Kontynuowałem pracę nad biblioteką, o której wspomniano w Serializacji i deserializacji drzew wyrażeń w C #

Wygląda na to, że projekt został porzucony (2008), ale trochę popracowałem nad nim i teraz działa z .NET 4.0 i Silverlight. Zrobiłem poprawki błędów w ich kodzie, a także uczyniłem go bardziej niezależnym od DAL.

http://expressiontree.codeplex.com/

T. Webster
źródło
2
+1 za znalezienie działającego rozwiązania. Próbowałem użyć oryginalnej biblioteki w MSDN i nie mogłem deserializować prostego binarnego węzła wyrażenia. Twój projekt działa świetnie. Dzięki!
Jacobs Data Solutions,
2
Czy to projekt na Nuget?
Mohammad Dayyan
@MohammadDayyan, Microsoft był niezdecydowany i niekonsekwentny w kwestii swojego narzędzia do zarządzania pakietami. Czasami pakiety ASP.NET CORE można zainstalować za pomocą Nuget, w innych przypadkach np. Sterownik MongoDB nie będzie dostępny przez NuGet. Wciąż przynajmniej Microsoft miał wgląd, aby pozwolić NPM na zarządzanie pakietami. Bardziej prawdopodobne jest umieszczenie tego na NPM
T. Webster,
@RepoMan rozwiązanie problemu jest dla mnie o wiele więcej warte, gdy komuś pomaga. Może mógłbyś dołączyć jakąś dokumentację dotyczącą użytkowania - porozmawiajmy ..
T. Webster,
14

Inną opcją jest projekt serializacji drzewa wyrażeń w witrynie code.msdn.com - wydaje się, że jest więcej tego, czego potrzeba tutaj?

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

Bogaty
źródło
Kod serializacji drzewa wyrażeń został usunięty z galerii kodu code.msdn.microsoft.com/exprserialization. Masz jakiś pomysł, gdzie został przeniesiony, lub lepsze alternatywy?
Kiran Bheemarti,
@Kiran: Co masz na myśli? Kod do pobrania jest nadal dostępny; sprawdź kartę pobierania u góry strony.
Robert Harvey
Tak jest teraz, chyba chwilowa rzecz, strona wyrzucała wczoraj błąd nie znaleziono projektu, gdy próbowałem powyższego linku. Widzę projekt i pobieram teraz. Dzięki!!!
Kiran Bheemarti
13

W serwisie GitHub / Nuget istnieje projekt o nazwie MetaLinq, którego celem jest ułatwienie pracy z warkoczem wyrażeń.

Konwertuje między zwykłymi wyrażeniami i `` EditableExpressions '', które są zmienne iw pełni serializowalne, więc mogą być używane z Json, Xml, Binary itp.

Sprawdź również ten wpis na blogu, aby uzyskać więcej informacji.

Pop Catalin
źródło
12

spójrz na moją nową bibliotekę Serialize.Linq . Serializuje wyrażenia linq do formatu json, xml i binarnego.

esskar
źródło
używałeś tego wcześniej? jakie było twoje doświadczenie / znalazłeś jakieś ograniczenia
Alexandre Brisebois
Użyłem podobnej wersji w moim ostatnim projekcie. działa dobrze.
esskar
Dlaczego miałbyś pisać coś, co gorzej zaciera granice między poziomami? Promujesz ekspozycję obiektów domeny DAL na BAL ... chyba że twoja biblioteka w jakiś sposób automatycznie konwertuje DTO (i zapytania skierowane do nich) na obiekty / zapytania domeny. Nie widzę w dokumentach nic wskazującego na takie zachowanie.
M.Babcock
@ M.Babcock: to, czego chcesz użyć w wyrażeniach DTO vs Entities, nie jest częścią logiki biblioteki.
esskar
4
@esskar Twój blog / cała witryna wydaje się zniknąć. czy to się poruszyło?
Jon
3

Nie w całości; Jednak przykład Dynamic LINQ może trochę pomóc. Z pewnością można serializować wyrażenie do łańcucha (do pewnego stopnia - typy generyczne wyglądają trochę dziwnie), ale nie ma wbudowanego parsera.

Marc Gravell
źródło
Nie mogę dowiedzieć się, jak serializować wyrażenie do ciągu przy użyciu próbki, tylko w innym kierunku, aby wziąć go jako ciąg i utworzyć drzewo wyrażenia. Jaką metodę mam wywołać?
Christopher Edwards,