有没有人想出一种使用标准LinqToSql查询语法对任意数量的任意关键字执行全文搜索(FREETEXT() CONTAINS()
)的好方法?
我显然希望避免使用存储过程或必须生成动态SQL调用。
显然,我可以将参数中的搜索字符串输入到使用FREETEXT()或CONTAINS()的SPROC中,但我希望通过搜索更具创意并构建如下查询:
“意大利辣香肠披萨”和汉堡,而不是“苹果派”。
疯狂我知道 - 但是能不能直接从LinqToSql做到这一点是不是很好?关于如何实现这一目标的任何提示都将非常感激。
更新:我想我可能会选择here ...
另外:我回滚了对我的问题标题所做的更改,因为它实际上改变了我所要求的含义。我知道 LinqToSql不支持全文搜索 - 如果我想知道,我会问这个问题。相反 - 我更新了我的头衔,以安抚编辑快乐触发器手指群众。
答案 0 :(得分:5)
我设法通过使用表值函数来封装全文搜索组件,然后在我的LINQ表达式中引用它来保持延迟执行的好处:
string q = query.Query;
IQueryable<Story> stories = ActiveStories
.Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o)
.Where (s => (query.CategoryIds.Contains(s.CategoryId)) &&
/* time frame filter */
(s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) &&
(s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value)));
这里'tvf_SearchStories'是内部使用全文搜索的表值函数
答案 1 :(得分:4)
不幸的是,LINQ to SQL不支持全文搜索。
我认为有很多产品可供选择:Lucene.NET,NHibernate Search。 LINQ for NHibernate结合NHibernate Search可能会提供这种功能,但两者仍处于测试阶段。