Как реализовать функцию динамического поиска с помощью C# и Linq?

Я пытаюсь реализовать функцию динамического поиска на С#. Мой поиск будет таким

Attribute operand Value === > Height > 170 

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

Каков наилучший способ реализации такого поиска? Я новичок в Linq и пытаюсь понять http://www.albahari.com/nutshell/predicatebuilder.aspx

Как я могу динамически создавать запросы или что будет лучшим способом для такого рода поиска, который легко поддерживать?

Пример:

Attribute operand Value === > Height = 170 
Attribute operand Value === > Altitude > 40000  
Attribute operand Value === > temperature < 105 

Все настраивается пользователем и создается во время выполнения.

Каков наилучший способ реализовать это?


person user2067567    schedule 09.03.2013    source источник
comment
Пожалуйста, не могли бы вы показать код   -  person cuongle    schedule 09.03.2013
comment
Нахожусь в начальной стадии внедрения. Просто хочу уточнить у вас, ребята, какой подход лучше всего?   -  person user2067567    schedule 09.03.2013


Ответы (1)


Проверьте этот ответ на этот вопрос, чтобы увидеть пример динамического построения выражения.

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

PropertyInfo propInfo = typeof(T).GetProperty(Attribute);
ParameterExpression pe = Expression.Parameter(typeof(Attribute), Attribute);
Expression right = Expression.Parameter(typeof(int), Value);
Expression predicateBody = Expression.GreaterThan(left, right);

Expression<Func<int, bool>> lambda1 =
                Expression.Lambda<Func<int, bool>>(
                    predicateBody,
                    new ParameterExpression[] { numParam });

Справочник — Деревья выражений и ExpressionType.

person Srikanth Venugopalan    schedule 09.03.2013
comment
Спасибо. Я получил идею деревьев выражений. Но как мне это сделать во время выполнения. В моем случае, как я узнаю, ищет ли пользователь 1 значение атрибута или 5 атрибутов. только я знаю, после того, как он нажмет кнопку правильно? - person user2067567; 11.03.2013
comment
Также настраиваются в моем вопросе, например, Высота › 170, все три параметра будут введены пользователем во время выполнения. - person user2067567; 11.03.2013
comment
Это требует немного больше интеллекта в системе. То, что вы говорите, потребует входного вывода ex 1, или многие параметры будут переведены либо в операцию equal, либо в операцию in. Но перестановка этих случаев может быть запретительной в некоторых других случаях. - person Srikanth Venugopalan; 11.03.2013
comment
Вы определенно можете предоставить некоторую настройку, но было бы хорошо, если бы были границы. В противном случае вы бы увидели, как пользователь запрашивает функции, подобные SQL. Не то чтобы это невозможно, возможно, это не стоит усилий, есть лучшие инструменты для запросов/отчетов. - person Srikanth Venugopalan; 11.03.2013