【发布时间】:2010-10-08 14:44:15
【问题描述】:
Linq 中没有内置全文搜索,而且似乎没有很多关于该主题的帖子,所以我尝试了一下,并为我的实用程序类想出了这个方法:
public static IEnumerable<TSource> GenericFullTextSearch<TSource>(string text, MyDataContext context)
{
//Find LINQ Table attribute
object[] info = typeof(TSource).GetCustomAttributes(typeof(System.Data.Linq.Mapping.TableAttribute), true);
//Get table name
String table = (info[0] as System.Data.Linq.Mapping.TableAttribute).Name;
//Full text search on that table
return context.ExecuteQuery<TSource>(String.Concat("SELECT * FROM ", table, " WHERE CONTAINS(*, {0})"), text);
}
并将这个包装器添加到每个有全文索引的部分 Linq 类中
public static IEnumerable<Pet> FullTextSearch(string text, MyDataContext context)
{
return (LinqUtilities.GenericFullTextSearch<Pet>(text, context) as IEnumerable<Pet>);
}
所以现在我可以使用诸如
之类的简洁内容进行全文搜索var Pets = Pet.FullTextSearch(helloimatextbox.Text, MyDataContext).Skip(10).Take(10);
我假设目前只需要非常基本的搜索。有人可以改进吗?是否可以作为扩展方法实现并避免包装器?
【问题讨论】:
-
关于您的查询的一个危险/非最佳问题是 .Skip().Take() 将在客户端而不是服务器端执行。因此,如果您执行一个返回 10^6 个结果的 FTS,并且您只想拥有前 10 个结果,那么所有 10^6 个结果都将从数据库中返回,然后您才会执行过滤。
-
是的,在这么大的数据集上,我会考虑另一种技术;)
标签: linq linq-to-sql search full-text-search