Я использую стандартный шаблон посетителя для итерации по дереву выражений LINQ с целью создания динамических предложений SQL WHERE.
Моя проблема в том, что в отличие от C #, вы не можете использовать автономное логическое выражение в SQL; Вы должны сравнить его с 1 или 0.
Учитывая это гипотетическое лямбда-выражение:
h => h.Enabled || h.Enabled == false
Было бы легко по ошибке сгенерировать этот код:
WHERE Enabled OR Enabled = 0
или этот код:
WHERE (Enabled = 1) OR (Enabled = 1) = 0
Оба, конечно, сгенерируют ошибку SQL. Какую логику я должен применить, чтобы обойти это без того, чтобы мой код не выглядел действительно тупым, когда я углубляюсь в поддеревья, чтобы выяснить, в чем дело?
РЕДАКТИРОВАТЬ: приведенный выше пример, конечно, излишним - я использую его только для иллюстрации точки.
Примеры, которые могут создать этот сценарий:
h => h.Enabled
h => h.Enabled == enabled
h => h.Enabled == true
Естественно, что последний пример - плохой стиль, но мой код предназначен для работы независимо от уровня навыка программиста, поэтому не удовлетворять избыточным сценариям будет плохо с моей стороны.