2015-04-27 2 views
1

У нас есть реляционный 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?

+0

Я сделал что-то близко к аннотации данных в Классы POCO, которые дают мне имена полей для использования в управлении поиском (отражение), а не для создания фильтра на основе DapperExtensions (с использованием IPredicate).Тем не менее, для этого потребуются как Dapper, так и DapperExtensions (и создание сопоставлений POCO для вашей БД). Это просто способ, если никто не появляется. =) –

+1

Если вы находитесь на веб-странице, вы можете попробовать [это решение для javascript] (https://github.com/crowcoder/ISBjs). Если вы работаете в WPF, у Telerik есть контроль за этим, но я не помню названия, и, конечно, это стоит денег. – Crowcoder

+0

спасибо, идея ISBjs выглядит очень многообещающей –

ответ

1

Хотя все решения, о которых вы упомянули, вероятно, будут работать, я порекомендую Elasticsearch.

Elasticsearch - это хранилище документов, которое построено поверх Lucene (вам не нужно запускать отдельный сервер Solr), и его очень легко запустить и установить. Существует также хороший API .Net для него под названием Nest. Как упоминалось в названии, оно специально построено для поиска. И он также имеет пейджинг, встроенный в многие другие функции.

Вы можете легко сохранить только свои условия поиска в db и вернуть идентификаторы, применимые к вашему поисковому запросу. В настоящее время мы используем его для хранения всех наших данных в качестве документов, однако есть много людей, которые используют его, чтобы просто выполнить все их поиски.

Вы буквально просто скопируете exe на свой компьютер и запустите его. Затем у вас есть REST api, который позволяет вам общаться с ним. Гнездо реферат это.

Вы можете встроенные динамические запросы, используя гнездо, просто добавив на объект поиска или если вы хотите, чтобы вы построили объект JSON, который вы передаете в.

Смежные вопросы