【问题标题】:Sql Server Freetext through Entity FrameworkSql Server Freetext 通过实体框架
【发布时间】:2011-08-20 05:34:19
【问题描述】:

我有一个使用 ASP.NET MVC 3 和 Entity Framework 4 开发的现有网站,用于查询 Sql Server 2008 数据库。它包含一个包含大约 10 个字段的搜索表单,当用户单击提交按钮时,我会动态创建一个 Entity SQL 请求,该请求仅包含指定的搜索字段,省略空字段。有用。到目前为止一切顺利。

现在,客户希望其中一个字段具有全文搜索行为。我认为这个请求非常复杂,因为(AFAIK):

  • Entity Framework 本身不支持全文搜索
  • 我想避免使用存储过程来包装 FTS 语法,因为到目前为止我只使用“静态”SP,将逻辑保留在 .NET 代码中。所以我想尽量避免在过程中构建查询。并且不能为每个可能的搜索字段组合创建一个过程。

目前我能想到的解决方案:

  • 将存储过程或用户定义函数作为 seach 谓词放在 WHERE 子句中(但我不确定这是否可行)
  • 在临时表中单独获取 FTS 结果,并在该临时表上执行其他过滤器。如果使用这种技术有很多 FTS 结果,我担心性能不佳...

处理这个问题的最佳方法是什么?

【问题讨论】:

    标签: .net sql-server entity-framework entity-framework-4 full-text-search


    【解决方案1】:

    你不能只使用原始 sql 吗?那么您可以将逻辑保留在您的 .NET 代码中。

    所以,它看起来像:

    string sql = "DO FULLTEXT STUFF";
    MyObjectContext.ExecuteStoreQuery<MyEntity>(sql, .......);
    

    【讨论】:

    • +1 这点很好。通过这样做,您甚至可以在 SQL Server 上引入全文搜索。我认为sp_executesql 是不需要的,因为ExecuteStoreCommand 直接使用它。
    • 感谢您的建议。我试图通过保持实体查询构建来增强它,然后生成结果 SQL 查询并在执行之前用 FREETEXT 替换 LIKE precidate。
    【解决方案2】:

    您不必考虑性能 - 无论如何这会很慢,因为您将用标准字符串比较连接值替换索引全文搜索。

    三种方法:

    • 像现在一样动态创建 ESQL 查询,但在列的连接值上使用 LIKE
    • 用户定义的 SQL 函数或 model defined function 用于评估导入到您的 EDMX 模型并公开用于 Linq-to-entities 查询的搜索检查。
    • 不要直接在表上搜索,而是使用带有计算列(包含所有十个字段)的视图并在该列上运行“全文”。

    任何这些方法都不是性能的解决方案。

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      相关资源
      最近更新 更多