Regex в Linq (EntityFramework), обработка строк в базе данных

У меня есть столбец в моей таблице, который содержит значения как

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

Фильтры разделяются символом ';' и значения каждого фильтра разделяются символом ",". Между именем фильтра и его значениями есть ":".

Теперь, могу ли я сделать все, что могло бы извлечь только часть значений? Как "123,234,34" для "FilterA". Или я могу дать ему число "234" для поиска в значении "FilterA" и/или "54" в части значений "FilterB"? Я знаю, что это возможно с использованием regex, я думаю, но я понятия не имею, как это сделать.

4 ответа

Вы не можете использовать регулярные выражения в запросах Linq to Entities, потому что они не могут быть переведены в SQL. Вы даже не можете использовать String.Split для разделения ваших фильтров на ;. У вас есть два варианта:

  • Изменить структуру таблицы базы данных. Например. create table Foo_Filter, который свяжет ваши объекты с фильтрами. А затем создайте таблицу Filters, которая будет содержать данные фильтров.
  • Выполнять запрос в памяти и использовать Linq для объектов. Этот параметр будет медленным, потому что вам нужно извлечь все данные из базы данных в память.


Если ваш базовый поставщик баз данных - это SQL Server, вы можете использовать SqlMethods.Like, чтобы отфильтровать результат базы данных до управляемого подмножества данных, которые затем могут быть проанализированы локально с помощью RegEx


Я предполагаю, что если вы хотите, чтобы все выполнялось на сервере базы данных, вам понадобилась бы функция SQL, которая могла бы анализировать эти фильтры, возможно, вернув таблицу с несколькими столбцами. К сожалению, я не нахожусь на машине, где я мог бы предоставить любой пример кода.


+1 для @lazyberezovsky, вы не можете делать регулярное выражение в Linq для Entities, потому что он не может перевести это в SQL. Вы можете вернуть все записи в память, а затем Linq to Objects на него (сделайте .ToList() для переменной, а затем второй запрос linq для этого регулярного выражения), но это означает, что вы будете загружать каждую запись db в память для обработки этого запроса. Те же рекомендации: измените структуру БД таким образом, что вам не нужно это делать.

licensed under cc by-sa 3.0 with attribution.