Создание выражения на DataTable, предложение по дизайну? - PullRequest
3 голосов
/ 25 января 2012

У меня есть вопросы с данными в столбцах Question_Id, значение, включить.Это будет загружено списком вопросов с ответами.

Элементы управления пользовательским интерфейсом будут создаваться на основе вопросов, для которых можно задать вопрос с включенным значением true.Если пользователь выбирает / изменяет ответ на любой из вопросов, значение будет обновлено в таблице вопросов, в результате чего будет включен / отключен другой связанный вопрос, если таковой имеется.

Это будет определяться в выражении, например, «Включить X, если Y == (someValue) AND / OR .....» здесь X, Y - вопрос.

Я хотел бы использовать дерево выражений в Linq.Expression, чтобы справиться с этим, но впервые в оценке Expression и в поиске подходящего подхода к проектированию для реализации.

Может ли кто-нибудь помочь мне в этом?

1 Ответ

0 голосов
/ 27 января 2012

Если я правильно понимаю вопрос, вы строите список вопросов, который должен динамически обновляться на основе ответов на эти вопросы. Например, если ответ на вопрос № 1, то вопрос № 2 должен быть отключен (или что-то более сложное).

Я большой поклонник динамической генерации кода (например, деревьев выражений), но на самом деле это можно решить проще с помощью структуры XML, так как она позволяет представлять отношения гораздо лучше, чем один DataTable.

<question id="1">
    <if valueToCompare="Foo" operator="EqualTo">
        <disable questionId="5" />
        <removeOption questionId="6" optionId="2" />
    </if>
</question>

Всякий раз, когда меняется ответ пользователя на вопрос, просто посмотрите на соответствующий узел XML и действуйте соответствующим образом.

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

Однако, если вы хотите узнать о выражениях, вы, безусловно, можете экстраполировать и конструировать их из структуры XML и создавать делегаты, которые вызываются при изменении вопроса. Например, если ответ на вопрос № 1 должен отключить вопрос № 2, вы можете превратить эту логику в делегат, который запускается при изменении вопроса № 1.

Это потребует первоначального анализа вашего источника данных (XML или иным способом - вы, безусловно, можете хранить простые логические операторы в DataTable в виде строк или нескольких столбцов и анализировать их) и превращать определения условных операторов в деревья выражений. Это может быть довольно просто или сложно в зависимости от того, насколько сложным вы хотите, чтобы ваши деревья решений были.

...