我有一个LINQ-2-Entity查询构建器,根据相当复杂的搜索表单嵌套不同种类的Where子句。到目前为止工作得很好。
现在我需要在一些查询中使用SQL Server全文搜索索引。是否有机会将搜索词直接添加到LINQ查询中,并将分数作为可选属性提供?
如果没有,我可以编写一个存储过程来加载与全文搜索条件匹配的所有行ID的列表,然后使用LINQ-2-Entity查询加载详细数据并评估其他可选的过滤条件< em>每行循环。这在性能方面当然是个坏主意。
另一种选择是使用存储过程将匹配全文搜索的所有行ID插入临时表,然后让LINQ查询加入临时表。问题是:如何在LINQ查询中加入临时表,因为它不能是实体模型的一部分?
答案 0 :(得分:2)
我想我可能会提出一种混合方法。
示例查询:
var q = from r in Context.SearchFor("searchText")
let fooInstance = (r.ResultType == "Foo")
? Context.Foos.Where(f => f.Id == r.Id)
: null
where ((fooInstance == null) || (fooInstance.SpecialCriterion == r.SpecialCriterion))
select {
// ...
这是我的头脑,所以语法可能不对。重要的是将搜索结果视为一个实体。
或者:使用更灵活的FTS系统,在构建索引时可以执行“特殊”的每类型过滤。
答案 1 :(得分:1)
我在EF4上看过这样的代码:
var query = context.ExecuteStoreQuery<Person>(
"SELECT * FROM People WHERE FREETEXT(*,{0})",
searchText
).AsQueryable();
这可能比在某些情况下创建存储过程或UDP更简单。