2013-01-19 10 views
7

Mam kolumny w moim tabeli, która zawiera jako wartościRegex w Linq (EntityFramework), przetwarzania danych w ciąg

"FilterA:123,234,34;FilterB:12,23;FilterC:;FilterD:45;" 

Filtry są oddzielone „;” a wartości każdego filtra są oddzielone przez ",". Pomiędzy nazwą filtra a jego wartością znajduje się znak ":".

Teraz mogę zrobić niczego, co można pobrać na część wartości tylko? Na przykład "123,234,34" dla "FilterA". Czy mogę nadać mu numer "234", aby wyszukać część wartości "FilterA" i/lub "54" w części wartości "FilterB"? Wiem, że jest to możliwe przy użyciu regex, chyba, ale nie mam pojęcia jak.

+0

Chcesz znaleźć kilka wierszy na podstawie wartości filtru lub czy chcesz wyodrębnić wartości filtru z niektórych już wybranych wierszy? – SDReyes

+0

Chcę zaznaczyć kilka wierszy porównując moje dane z danymi w ciągu filtra –

Odpowiedz

11

nie można używać wyrażeń regularnych w LINQ podmiotom zapytań, ponieważ nie mogą być tłumaczone na język SQL. Nie można nawet użyć String.Split, aby podzielić filtry według ;. Dostępne są dwie opcje:

  • Zmiana struktury tabeli bazy danych. Na przykład. utwórz tabelę Foo_Filter, która połączy twoje jednostki z filtrami. Następnie utwórz tabelę Filters, która będzie zawierać dane filtrów.
  • wykonać zapytania w pamięci i użyć Linq do obiektów. Ta opcja będzie powolna, ponieważ musisz pobrać wszystkie dane z bazy danych do pamięci
+0

„Wykonanie zapytania w pamięci i użyć LINQ to Objects. Opcja ta będzie powolny, ponieważ trzeba pobrać wszystkie dane z bazy danych do pamięci” jest to, co próbowałem uniknąć! –

+1

@TahaRehmanSiddiqui to tylko pierwsza opcja dla Ciebie. Nie ma sposobu na pobranie danych FilterA z łańcucha z Linq do Entities –

0

+1 dla @lazyberezovsky, nie można zrobić wyrażeń regularnych w Linq do Entities, ponieważ nie można tego przetłumaczyć na SQL. Można wyciągnąć wszystkie rekordy z powrotem do pamięci a następnie wykonaj Linq do obiektów na nim (zrobić .ToList() do zmiennej potem drugi zapytań LINQ do tego regex), ale to oznacza, że ​​będziesz załadować każdy rekord db do pamięci do przetworzenia tego zapytania. Te same zalecenia: zmień strukturę DB, tak abyś tego nie musiał robić.

0

Myślę, że jeśli chciał wszystko, aby wykonać na serwerze bazy danych, którą potrzebujemy funkcji SQL, które można przetworzyć te filtry, może wracać tabeli multi-kolumny. Niestety nie jestem na komputerze, na którym mógłbym podać przykładowy kod.

2

Jeśli bazowy dostawcy bazy danych SQL Server, a następnie można wykorzystać SqlMethods.Like filtrować wynik bazy ustawiony w dół do rozsądnego podzbiór danych, które mogą być następnie analizowane lokalnie z RegEx