如何使用Linq to ADO.NET实体框架进行全文搜索(FTS)?

11

现在SQL Server 2008已经内置全文搜索功能,我想把它用于我的网站搜索。我还考虑使用ADO.NET实体框架来进行ORM,但是我想知道如何使用Linq to ADO.NET实体框架进行全文搜索(FTS)?

ADO.NET实体框架是否支持全文搜索?或者我只能使用创建一个使用全文搜索谓词的函数的方法呢?


你正在使用EF 4或更早的版本吗? - Akash Kava
2个回答

12

Entity Framework仅支持部分可用的SQL功能(部分原因是为了保持与各种提供程序的兼容性)。但是,即使是支持更多SQL Server专有结构(例如UDF)的LINQ-to-SQL,我认为也不支持全文本。

我认为您需要使用存储过程/UDF。UDF方法更优,因为元数据层更强,并且在数据库服务器上可以组合-但是,Entity Framework不喜欢UDF;-p所以您可能需要使用存储过程。


在上面的回答中,这可能也有帮助:http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx - Jan Wikholm
@Marc,这么多年过去了,你还记得UDF方法包括什么吗?(其实,算了吧,我在使用CONTAINSTABLE时看到了一些例子) - Kirk Woll

10

我见过像这样的EF4代码:

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

在某些情况下,这可能比创建存储过程或用户定义的程序更简单。


@stefann,据我了解,EF会解析并防范此类攻击。 - Drew Noakes
2
在这个特定的例子中,EF无法捕获任何SQL注入。它会生成一个参数化的SQL查询,具有防止SQL注入的内在保护。如果您将搜索文本连接到实际字符串中,那么EF将解析该文本并捕获一些(而不是全部)注入。它将捕获最具破坏性的注入,例如“delete from...”,因为它无法正确解析。 - Steven Pena
1
文档指出:使用参数化命令有助于防范SQL注入攻击,其中攻击者向SQL语句中“注入”一条命令,从而破坏服务器的安全性。参数化命令通过保证从外部源接收的值仅以值的形式传递,而非作为SQL语句的一部分,以防止SQL注入攻击。因此,插入到值中的SQL命令不会在数据源上执行。相反,它们仅作为参数值进行评估。 - Drew Noakes
1
@splattne,我的答案中使用的表单确实可以防止SQL注入攻击。请查看此MSDN页面底部的解释,其中说明我展示的表单与您链接到的表单等效。我的答案中的这种形式更为简明,因此我更喜欢它! - Drew Noakes
但是你不能在数据库上过滤或分页结果吗?它返回的是 IEnumerable 吗? - TN.
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接