2010-04-18 1 views
10

mamJak zbudować kwerendę LINQ z tekstu w czasie wykonywania?

class A { 
    public int X; 
    public double Y; 
    public string Z; 
    // and more fields/properties ... 
}; 

i List<A> data i umożliwienia zapytanie linq jak np

var q = from a in data where a.X > 20 select new {a.Y, a.Z}; 

Następnie dataGridView1.DataSource = q.ToList(); wyświetla zaznaczenie w moim DataGridView.

Teraz pytanie, czy możliwe jest zbudowanie zapytania z tekstu wprowadzonego przez użytkownika w czasie wykonywania? Podobnie jak w przypadku, gdy użytkownik (posiadający umiejętności programistyczne) może dynamicznie i dowolnie wybierać wyświetlane dane.

Odpowiedz

4

Cóż, można użyć CSharpCodeProvider do kompilacji kodu w czasie wykonywania. Zajrzyj na przykład do tego pod Snippy. W takim przypadku musisz skompilować kod użytkownika w metodzie akceptującej List<A> o nazwie data. Moje doświadczenie jest takie, że działa, ale może być nieco kłopotliwe, aby uzyskać prawo - w szczególności w zakresie dodawania odpowiednich odniesień itp.

+3

+1, ale byłbym zaniepokojony kompilacją i wykonanie dowolnego kodu. wymagałoby należytej staranności, a po zrobieniu czegoś takiego, mówię, że to nie jest zabawa i będzie prześladować twoje sny. ;-) –

5

Dynamic Linq kochanie!

r.e. komentarz.

Tak, przykładowy zapis może nie być możliwy przy użyciu Dynamic Linq, ale jeśli współczynnik zostanie pomnożony, np. "od danych" pozostawiasz "miejsce" i "wybierz", które można wyrazić za pomocą dynamicznego linq.

więc dwa pola tekstowe, być może trzy, jeśli uwzględnisz zamówienie, mogą spełnić Twoje wymagania.

Po prostu myśl.

Jon ma ciekawe podejście, ale nie byłbym skłonny do kompilowania i wykonywania nieskrępowanego kodu.

+0

Nie widzę, jak to jest możliwe w Dynamic Linq. – Danvil

+0

@Danvil - masz rację, twój przykład, jak napisano, może nie być możliwy, ale kiedy wyprowadzisz stałe, takie jak ... ach, do diabła, po prostu edytuję odpowiedź .. –

0

Chociaż może być kilka sposobów, aby to zrobić, LINQ po prostu nie jest przeznaczony do tego scenariusza . Korzystanie z CodeDOM (jak sugerował Jon) jest prawdopodobnie jedynym sposobem na łatwe zrobienie tego. Jeśli ufasz użytkownikowi i ma on umiejętności programistyczne, możesz po prostu użyć staroświeckich metod i pozwolić użytkownikowi wprowadzić zapytanie za pomocą SQL?

Jeśli z drugiej strony zdecydujesz się na stworzenie wizualnego narzędzia do konstruowania zapytań, nie musisz budować ich przez komponowanie ciągów znaków i możesz tworzyć drzewa wyrażeń zamiast tego. Na przykład przy użyciu Linq Kit i AsExpandable.

+0

Mam dane w formie klasy, a nie w bazie danych. Myślę jednak, że używając LINQ, być może uda mi się osiągnąć podobne interaktywne zachowanie queriyingowe na zajęciach - podobnie jak zapytania SQL mogą robić w bazie danych. – Danvil

1

Odpowiadając na to dość późno; Pomoże to jednak komuś, kto odwiedza tę stronę.

Miałem podobne wymagania i rozwiązałem je, dynamicznie kompilując ciąg znaków jako zapytanie LINQ, wykonując je w zbiorze pamięci i zbierając wynik. Tylko catch to dane wejściowe użytkownika muszą być prawidłowe C# kompilowalny kod else zwraca komunikat wyjątku zamiast wyniku.

Code jest dość długi, więc tutaj jest zastosowanie github link

próbki na github pokazuje wiele przykładów w tym projekcji.