2010-09-23 17 views
15

Próbuję tutaj wykonać naprawdę dynamiczne kwerendy - najlepiej bez wywoływania kompilatora w czasie wykonywania.Parsowanie ciągu C# LINQ wyrażenie

Mam ciąg znaków zawierający wyrażenie LINQ, np.

var s = "from a in queryable where a.Type == 1 select a"; 

Jak mogę uzyskać wynikowe IQueryable lub Wyrażenia z tego?

Widziałem, jak LINQPad i RavenDb robią to, więc jestem przekonany, że istnieje sposób, po prostu jeszcze tego nie znalazłem.

Odpowiedz

20

Masz kilka opcji:

  1. zrobić coś rodzimych, przetwarzania tekstu i budowania drzewa wyrażenie. Standardowym podejściem do tego byłoby użycie parsera językowego do przeanalizowania ciągu znaków (np. ANTLR).

  2. Zastosowanie CodeDOM kompilacji kwerendy (nie zalecane dla environent produkcji, jak to jest powolny i generuje montaż za kompilację, która będzie nasycić swój AppDomain z zespołów, jeśli nie wielu. Pragnę podkreślić, nie idź tą drogą jeśli masz jakiekolwiek objętości - chociaż to, co robi LINQPad) - http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/6a4defd2-76f0-4865-97b7-130e4ba7b50a

  3. kompilator trybu monofonicznego używać, która emituje MSIL bezpośrednio (czyli bez montażu na kompilacji i znacznie szybciej) - Mono Compiler as a Service (MCS)

  4. Zastosowanie dynamicznej LINQ (ma pewne ograniczenia i ograniczenia, ale w zasadzie to robi co jest zasugerowane w punkcie # 1 i jest ładne, lekkie i ma możliwość zezwalania tylko na pewne wywołania metod. Analizuje tekst kwerendy i buduje drzewo Expression od niego) - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+1

# 1 jest niepraktyczne. # 3 nie działa pod Microsoft CLR (wypróbowany ...). # 4 działa dobrze, ale tak, chodzi o ograniczenia. –

+0

Mam zamiar wypróbować # 3, przeczytałem jakiś wpis na blogu Miguela de Icazy, że Mono.CSharp działa teraz na MS CLR. –

+2

Numer 3 działa w środowisku MS Windows CLR. Próbowałem go i obecnie używam w produkcji. Jeśli daje ci prolek, sprawdź mój wpis na tym. Kevin, jeśli wybierzesz numer 3, upewnij się, że postępujesz zgodnie ze wskazówkami w moim wpisie, z którym się łączyłem, lub nie będziesz mógł używać LINQ, a skończysz z tym samym zestawem na problem z kompilacją, jak CodeDom. – Jeff

0

Idąc z „magicznym ciągiem” do kodu obiektów zawsze wiąże się jakieś parsowania. W takim przypadku najlepiej będzie pracować z biblioteką EditableExpression (dostępna bezpłatnie od Google Code). Weź ciąg znaków i sformatuj go tak, aby wyglądał jak wynik serializacji serii EditableExpressions. Następnie po prostu deserializuj go i przekonwertuj do drzewa wyrażeń.

+0

Dlaczego te głosy na dół? –