如何实现动态参数化搜索?

时间:2015-04-27 21:13:52

标签: c# sql-server entity-framework search reporting-services

我们有关系数据库(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

搜索的结构将保持不变 - 由&#34; AND&#34;连接的一系列条件;每个条件都可能有一些&#34; OR&#34;里面的物品。

我们正在使用实体框架;

到目前为止,我看到了实现此功能的几种方法:

  • 1)构建SQL查询并针对db运行(非常繁琐)

  • 2)创建EF IQueryable 对象并使用EF获取数据 更容易,但我担心结果SQL会很糟糕)

  • 3)使用Lucene.NET (它需要Solr服务器,我想避免它 如果可能的话)

  • 4)创建db的非规范化OLAP实例并使用方法(1)或(2)

我很确定必须有其他方法;毕竟,EF / .NET / SQL组合并不是那么罕见;如果我可以避免它,我不想重新发明轮子。理想的解决方案是解析搜索字符串,进行搜索并返回必填字段(分页也是一个很好的补充)

SSAS / SSRS会有帮助吗?

1 个答案:

答案 0 :(得分:1)

虽然您提到的所有解决方案都可能有效,但我会推荐Elasticsearch

Elasticsearch是一个构建在Lucene之上的文档存储(虽然您不需要运行单独的Solr服务器),并且非常易于运行和安装。还有一个很好的.Net API,名为Nest。顾名思义,它专门用于搜索。它还具有许多其他功能中的分页功能。

您可以非常轻松地在数据库中存储您的搜索字词,并返回适用于您的搜索查询的ID。我们目前使用它将所有数据存储为文档,但有很多人使用它来进行所有搜索。

您只需复制机器上的exe并运行它即可。然后你有一个REST api,允许你与它进行通信。 Nest抽象了这个。

您可以使用Nest构建动态查询,只需添加到搜索对象上,或者如果您愿意,可以构建一个传入的json对象。