C # расширенный оператор запроса String Processing

2

Я ищу либо лучшую практику, либо библиотеку для обработки строки в дереве объектов.

вот пример:

"[age] = '37' И [пол] не является нулевым и [optindate] > '2003/01/01' И [idnumber] is Null And ([saresident] = '52' или [гражданство] Like 'а%')"

Я мог бы объективировать это в дереве примерно так:

{attribute='age', operator='=', value='37', opperand='And'}
{attribute='gender', operator='Is Not Null', value='', opperand='And'}
{attribute='optindate', operator='>', value='2003/01/01', opperand='And'}

и т.д....

любые предложения были бы замечательными!

  • 0
    Я должен упомянуть, что выражение будет использоваться для запроса данных в схеме EAV (Пожалуйста, без комментариев)? Таким образом мне нужно встроить это в ExpressionTree (или что-то), чтобы затем рекурсивно и построить необходимые запросы SQL.
Теги:
string
oop

3 ответа

1
Лучший ответ

Если вам нужно сохранить операции в древовидной структуре, вы должны использовать постфиксную или префиксную нотацию. например возраст = 37, а пол не равен нулю следует хранить как

и = возраст 37!= гендерный нуль

поэтому дерево должно быть как

        and
   =         !=
age 37  gender  null

Вы можете использовать эти ссылки для более подробной информации: Обозначения, используемые для операций и Выражения, конверсия и оценка с помощью C (все, что вам нужно знать о выражениях)

  • 0
    Согласно моему комментарию выше, я, к сожалению, не могу контролировать строку, которую возвращает filtercontrol?
  • 1
    Нет, я не предлагаю вам изменить строку. Мое предложение заключается в том, что древовидная структура должна использовать префиксную нотацию. Т.е. 'и' должны быть root, '=' и '! =' Children of 'and' и так далее. Все операнды должны быть конечными узлами и потомками соответствующих операторов. Поэтому, когда выражение должно быть оценено, дерево должно быть проанализировано соответствующим образом.
Показать ещё 2 комментария
1
1

Как насчет динамической библиотеки LINQ ? Вы можете либо использовать "как есть" , либо посмотреть, как он создает предикат Expression<Func<T,bool>> (который является деревом).

  • 0
    Проблема заключается в том, что строка генерируется собственным фильтром управления. Мне нужно преобразовать жало в нечто вроде дерева выражений?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню