Я хочу иметь приложение, в котором пользователь (обычно опытный пользователь) может вводить логическое выражение. Я хочу иметь возможность выполнять логическое выражение как в .NET, так и в SQL.
Сами выражения не так уж сложны, это такие вещи, как:
- страна Соединенные Штаты
- страна одна из: сша, канада, мексика
- (страна США) И (возраст 20 лет)
- (страна — США) ИЛИ ((возраст — 20 лет) и страна — одна из: США, Канада)
Мне нужно иметь возможность поддерживать базовые вещи, такие как «в», «равно», «больше/меньше», «между», «содержит», «начинается с» и т. д. Я хочу иметь возможность компилировать в С# и запускать его для объекта типа dynamic
, а также быть в состоянии скомпилировать выражение в SQL. Я бы подключил результат к предложению where очень конкретного запроса.
Я не хочу использовать Nhibernate или EntityFramework, я хочу иметь возможность выполнять SQL напрямую.
ОБНОВЛЕНИЕ: я уже знаю, что хочу выполнить его с помощью ADO.NET. Извините, если я не ясно выразился. Я просто хочу знать, какой хороший подход был бы для хранения логического выражения, которое можно выполнить как на С#, так и на SQL. Меня не интересуют хранимые процедуры и параметризация (последняя очевидна и тривиальна, когда я могу сгенерировать запрос). Пользователи, вводящие выражения, являются внутренними для моей компании, в основном это разработчики и опытные пользователи.
Поэтому я думаю об использовании таких вещей, как деревья выражений, абстрактные синтаксические деревья, LINQ и т. д., для достижения этой цели. Я не хочу использовать ORM, но я хочу сделать что-то очень похожее на то, что делают ORM в своих выражениях LINQ, чтобы преобразовать лямбы в код для предложения WHERE
.
ОБНОВЛЕНИЕ 2: пока мы думаем об этом, чтобы выражения вводились как C# и сохранялись в виде строк в базе данных. Когда мы хотим выполнить в контексте .NET, мы скомпилируем его в лямбду или выражение и, возможно, обернем его в объект, который будет интерфейсом с методом для представления логического выражения interface IDynamicFilter { bool PassesFilter<SomePocoType>(poco); }
. Или мы могли бы поместить POCO в IEnumerable и запустить LINQ .Where() с переданным лямбда-выражением, чтобы получить объекты, соответствующие фильтрам.
Что касается SQL, это та часть, в которой я более нечеток. Мы хотим воспроизвести то, что делают ORM — посетить дерево выражений и преобразовать его в строку SQL. Нам не нужно поддерживать полный набор SQL. Нам нужно только поддерживать довольно простые операторы, такие как группировка со скобками, И/ИЛИ/НЕ, в/не в, GT/LT/EQ/NEQ/между. Мы также хотим поддерживать некоторые основные математические операции (a + b > c
).
SqlCommand
. Просто убедитесь, что вы настроили его для защиты от атак SQL-инъекций. - person Jeremy Holovacs   schedule 08.03.2013dynamic
, либо словарь строк, в зависимости от того, что работает лучше. Мы еще не разработали эту часть, поэтому я открыт для предложений. - person DarkwingDev   schedule 08.03.2013