我们正在使用EFv1,我正在实现一个带有多个过滤器选项的搜索控件。其中大多数我都翻译成。其中的条款和EF一样好。
但是有一个特定的过滤器可以让我的应用程序运行得很慢:文本搜索。数据库中的列在我的EF模型中有一个对应的实体属性,但我不能在其中放置包含,这对文本搜索不利。
在这种情况下你觉得什么感觉好?
我听说过Lucene,我不知道这是否与EFv1集成。
由于
答案 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的,但是路过的人可能会觉得这很有用。