全文搜索和实体框架v1:有可能吗?

时间:2009-12-15 17:38:08

标签: c# entity-framework full-text-search

我们正在使用EFv1,我正在实现一个带有多个过滤器选项的搜索控件。其中大多数我都翻译成。其中的条款和EF一样好。

但是有一个特定的过滤器可以让我的应用程序运行得很慢:文本搜索。数据库中的列在我的EF模型中有一个对应的实体属性,但我不能在其中放置包含,这对文本搜索不利。

在这种情况下你觉得什么感觉好?

我听说过Lucene,我不知道这是否与EFv1集成。

由于

5 个答案:

答案 0 :(得分:1)

您可以编写使用全文搜索进行搜索的用户定义函数,将其公开给实体框架并在C#中使用。我已经为LINQ to SQL做了这个,但对于EF它应该是相同的。请查看此博文:http://sqlblogcasts.com/blogs/simons/archive/2008/12/18/LINQ-to-SQL---Enabling-Fulltext-searching.aspx

答案 1 :(得分:1)

我遇到了类似的问题,这是使用存储过程才有意义的案例之一。我认为对于任何ORM,您总是会有需要精确优化的查询,而您无法依靠该工具为您完成。

在EF中导入存储过程非常简单,唯一的问题是与其他linq运算符组成该函数调用。 EF v1不会在服务器端执行此操作,这意味着您将进行内存过滤。

作为对另一个答案的说明,您无法真正在EF v1中执行功能导入See Here

答案 2 :(得分:1)

我成功完成了这项工作。步骤是:

  • 编写执行全文索引搜索的存储过程。
  • 更新模型定义(在上下文菜单中“从数据库更新模型”)。您需要添加新的存储过程
  • 创建函数导入(在“模型浏览器”窗口中,右键单击新的存储过程并创建函数导入)。将返回类型设置为适当的返回类型(您的某个实体)。

然后,您将拥有一个可以在Context上调用的方法,该方法将返回一个EntityCollection<>。

答案 3 :(得分:0)

Lucene.NET不会直接与EF集成,但您可以先使用它来获取候选实体ID列表,然后将其传递给EF查询。

答案 4 :(得分:0)

现在,在EF4中,您可以执行以下操作:

var query = context.ExecuteStoreQuery<Person>(
        "SELECT * FROM People WHERE FREETEXT(*,{0})", 
        searchText
    ).AsQueryable();

这可能比在某些情况下创建存储过程或UDP更简单。我知道你的问题是关于EF1的,但是路过的人可能会觉得这很有用。