@evolit
Вася

Как преобразовать текст из поля в логику запроса?

Предположим, что создаётся очень гибкий фильтр для таблицы, в котором логика прописыфвается оператором.
Пользователь открывает форму, в которой после некотроых манипуляций получает 5(в нашем примере) критериев:
  1. Содержит слово "дом"
  2. Заканчивается на "ться"
  3. Первое слово с большой буквы
  4. Содержит слово "сарай"
  5. Оканчивается на "!"

Учёт регистра сейчас во внимание не берём.

Далее выбирается столбец для применения фильтра (к примеру столбец "описание") , а в конце формы есть текстовое поле, в котором и прописывается логика фильтра, используя при этом критерии, приведённые выше.
К примеру это поле будет содержать что-то вроде "=(((1 и (2 или 4))или(2 и 3 и 4)) и 5)"

Вопрос вот в чём. Как это самое логическое выражение "=(((1 и (2 или 4))или(2 и 3 и 4)) и 5)" преобразовать в машинную логику?

Были мысли попробовать реализовать на питоне, где в ходе выполнения программа будет дописывать в исполняемый файл условия, основанные на введённой оператором логике, но, т.к. работаю преимущественно на С#, может там есть какая-то возможность это реализовать.

Надеюсь, понятно объяснил...
  • Вопрос задан
  • 2371 просмотр
Решения вопроса 1
aush
@aush
Можете воспользоваться библиотекой simproexpr.

Использовать как-то так (красоту наведете сами, я просто набросал рабочий пример):

static void Main(string[] args)
{            
    var criteria = new Expression<Func<string, bool>>[]
    {
        str => str.Contains("дом"),
        str => str.EndsWith("!"),
        str => str.Substring(0, 1).ToUpper().Equals(str.Substring(0, 1)),
    };

    var complexCriterion = "1 | (2 & 3)";

    var ep = new ExprParser();
    LambdaExpression lambda = ep.Parse("(string str) => " + BuildComplexCriterion(complexCriterion, criteria));

    var result = ep.Run(lambda, "дом");
}

static string BuildComplexCriterion(string complexCriterion, Expression<Func<string, bool>>[] criteria)
{
    for (var i = 0; i < criteria.Length; ++i)
    {
        complexCriterion = complexCriterion.Replace((i + 1).ToString(), criteria[i].Body.ToString());
    }

    return complexCriterion;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы