Лучший подход для динамической фильтрации объектов .Net - PullRequest
2 голосов
/ 09 января 2011

В проекте, над которым я сейчас работаю, есть способ определить фильтр для объектов из базы данных.
Этот фильтр - довольно простой класс, содержащий критерии, которые будут объединены для создания предложения SQL where.

Теперь цель состоит в том, чтобы использовать этот класс для фильтрации объектов .Net.Так, например, фильтр может указывать, что свойство title объекта, к которому он применяется, должно содержать некоторую пользовательскую строку.

Как можно решить эту проблему?Что должен возвращать фильтр вместо SQL-выражения where и как его можно применить к объекту?Я думал об этом часами и даже не представляю, как это решить.Думал об отражении, динамическом выполнении кода, построении выражений, но все еще не нашел отправной точки.

Ответы [ 2 ]

3 голосов
/ 09 января 2011

Зависит от того, каковы все варианты использования:)

Если ваш код БД мог бы использовать LINQ, то я мог бы рассмотреть вопрос о возврате Expression<Func<YourEntity,bool>>, поскольку это можно применить через .Where как к LINQ на основе БД, так и к LINQ-to-Objects - в последнем случае просто вызывая :

var filtered = original.AsQueryable().Where(filter);

(код БД, как правило, уже запрашиваемый, поэтому AsQueryable не требуется).

Одна плохая вещь в этом заключается в том, что нет гарантии, что конкретное выражение запроса будет работать на каждом поставщике LINQ.

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

Одна заключительная мысль - просто получить два разных результата запроса и разделить две ветви. Итак, один SQL, один Predicate<T> или аналогичный. Однако существует риск того, что они будут не синхронизированы.

2 голосов
/ 09 января 2011

Если вы хотите сделать это немного похожим на динамически созданное предложение SQL where, вы можете использовать Dynamic LINQ для достижения аналогичных эффектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...