У нас есть реляционный db (SQL Server 2014, около 30 таблиц, очень нормализованный). Приложение построено с использованием Web.API/AngularJSКак реализовать динамический параметризованный поиск?
Нам нужно реализовать динамический поиск - пользователь может выбрать несколько полей из нескольких объектов; в результате поиск псевдо-код может выглядеть следующим образом:
SearchConditions
(
{Company.Name} <Contains> "Enterprise"
)
AND
(
{Customer.State} <Equals> "MO"
OR
{Customer.State} <Equals> "TX"
)
AND
(
{Company.AnnualSales} <LessThan> "123456.00"
)
Return
Company.Name,Customer.Name
Group By State, Company
Структура поиск останется той же - куча условий, связанных «И»; каждое условие может иметь несколько элементов «ИЛИ» внутри.
Мы используем Entity Framework;
до сих пор я вижу несколько путей для реализации этой функции:
1) сборки SQL запрос и запустить его с БД (довольно громоздкими)
2) создать EF IQueryable объект и получить данные с помощью EF (несколько проще, но я боюсь, что результат SQL будет ужасным)
3) использование Lucene.NET (это потребует сервер Solr, я хотел бы избежать , если это возможно)
4) создать денормализованный экземпляр OLAP нашей БД и использовать подход (1) или (2)
Я уверен, что должны быть другие способы; в конце концов, комбинация EF/.NET/SQL не так редка; Я не хочу изобретать велосипед, если смогу его избежать. Идеальное решение будет анализировать строку поиска, выполнять поиск и возвращать требуемые поля (пейджинг также будет хорошим плюсом)
Помогло бы SSAS/SSRS?
Я сделал что-то близко к аннотации данных в Классы POCO, которые дают мне имена полей для использования в управлении поиском (отражение), а не для создания фильтра на основе DapperExtensions (с использованием IPredicate).Тем не менее, для этого потребуются как Dapper, так и DapperExtensions (и создание сопоставлений POCO для вашей БД). Это просто способ, если никто не появляется. =) –
Если вы находитесь на веб-странице, вы можете попробовать [это решение для javascript] (https://github.com/crowcoder/ISBjs). Если вы работаете в WPF, у Telerik есть контроль за этим, но я не помню названия, и, конечно, это стоит денег. – Crowcoder
спасибо, идея ISBjs выглядит очень многообещающей –