【问题标题】:How to implement dynamic parameterized search?如何实现动态参数化搜索?
【发布时间】:2015-07-06 12:20:02
【问题描述】:

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

搜索的结构将保持不变 - 由“AND”连接的一堆条件;每个条件里面可能有几个“OR”项。

我们正在使用实体框架;

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

  • 1) 构建 SQL 查询并针对 db 运行(相当麻烦)

  • 2) 创建 EF IQueryable 对象并使用 EF 获取数据(有点 更容易,但我担心生成的 SQL 会很糟糕)

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

  • 4) 创建我们数据库的非规范化 OLAP 实例并使用方法 (1) 或 (2)

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

SSAS/SSRS 会有帮助吗?

【问题讨论】:

  • 我已经通过接近 POCO 类的数据注释来做到这一点,它为我提供了用于搜索控制(反射)的字段名称,而不是基于 DapperExtensions(使用 IPredicate)构建过滤器。不过,它需要 Dapper 和 DapperExtensions(以及创建到您的数据库的 POCO 映射)。这只是一种方式,如果没有其他人出现=)
  • 如果你在网页上,你可以试试this javascript solution。如果你在 WPF 上,Telerik 可以控制它,但我不记得名字了,当然它要花钱。
  • 谢谢,ISBjs 的想法看起来很有前途

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


【解决方案1】:

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

Elasticsearch 是一个构建在 Lucene 之上的文档存储(尽管您不需要运行单独的 Solr 服务器),并且非常易于运行和安装。还有一个不错的 .Net API,称为Nest。顾名思义,它是专门为搜索而构建的。它还内置了分页功能以及许多其他功能。

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

您实际上只是将 exe 复制到您的机器上并运行它。然后你就有了一个允许你与之通信的 REST api。 Nest 对此进行了抽象。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多