Вы можете хранить правила как AST s - реализовать несколько классов, которые представляют узлы дерева:
interface INode
{
}
enum BinaryOperator
{
AND, OR, Equal, Greater, Lower;
}
class BinaryExpression : INode
{
BinaryOperator Operator { get; set; }
INode Left { get; set; }
INode Right { get; set; }
}
class PropertyRerefence : INode
{
string PropertyName { get; set; }
}
class Constant : INode
{
string Value { get; set; }
}
Дерево для вашего примера будет выглядеть так:
BinaryExpression(OR)
Left=BinaryExpression(AND)
Left=...
Right=...
Right=BinaryExpression(Greater)
Left=PropertyReference("Number")
Right=Constant("12")
Затем вы можете использовать сериализацию (лучше всего JSON или XML, возможно даже двоичный, если вам не нужна читабельность в БД) для сохранения таких деревьев.При десериализации вам не нужно выполнять какой-либо синтаксический анализ, и вы можете пройти по дереву для заполнения меню.
Печать "(Имя = 'Джон' И Фамилия = 'Смит') ИЛИ Number> 12" такжелегко, когда у вас есть AST - для выражения BinaryExpression: напечатайте Left, напечатайте Operator, напечатайте Right.
Вы говорите, что оценка уже выполнена, поэтому я опущу это.Вы также можете посмотреть на этот вопрос .