Sql server 实体框架、全文搜索和临时表
我有一个LINQ-2实体查询生成器,根据相当复杂的搜索表单嵌套不同类型的Where子句。到目前为止效果很好 现在,我需要在一些查询中使用SQL Server全文搜索索引。是否有机会将搜索词直接添加到LINQ查询,并将分数作为可选属性提供 如果没有,我可以编写一个存储过程来加载与全文搜索条件匹配的所有行ID的列表,然后使用LINQ-2实体查询来加载详细数据,并在每行的循环中计算其他可选的筛选条件。从性能角度来看,这当然是一个非常糟糕的主意Sql server 实体框架、全文搜索和临时表,sql-server,entity-framework,full-text-search,temp-tables,Sql Server,Entity Framework,Full Text Search,Temp Tables,我有一个LINQ-2实体查询生成器,根据相当复杂的搜索表单嵌套不同类型的Where子句。到目前为止效果很好 现在,我需要在一些查询中使用SQL Server全文搜索索引。是否有机会将搜索词直接添加到LINQ查询,并将分数作为可选属性提供 如果没有,我可以编写一个存储过程来加载与全文搜索条件匹配的所有行ID的列表,然后使用LINQ-2实体查询来加载详细数据,并在每行的循环中计算其他可选的筛选条件。从性能角度来看,这当然是一个非常糟糕的主意 另一种选择是使用存储过程将与全文搜索匹配的所有行ID插入到
另一种选择是使用存储过程将与全文搜索匹配的所有行ID插入到临时表中,然后让LINQ查询加入临时表。问题是:如何在LINQ查询中连接临时表,因为它不能成为实体模型的一部分?我想我可能会建议使用混合方法
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系统,在构建索引时,该系统可以对每种类型进行“特殊”过滤。我见过类似EF4的代码:
var query = context.ExecuteStoreQuery<Person>(
"SELECT * FROM People WHERE FREETEXT(*,{0})",
searchText
).AsQueryable();
var query=context.ExecuteStoreQuery(
“从自由文本(*,{0})”中选择*,
搜索文本
).AsQueryable();
在某些情况下,这可能比创建存储过程或UDP更简单。这在很多方面都是错误的。ExecuteStoreQuery返回IEnumerable,因此没有分页,没有实.Skip或.Take。AsQueryable()只是转换为另一种类型。@Crank,如果您不需要执行DB端的跳过/执行或进一步处理,这是正确的。如果确实需要,那么可以修改SQL字符串。如果你有更好的解决方案来实现全文搜索,请提供你自己的答案。是的,当你不需要做某事时,你显然不需要使用它。好老林克比那更好。您可以在表达式树中使用TVF作为真正的可查询项。。。我们正试图找到具有真正的代码优先支持的LINQ替代方案,唯一可用的(开源)是fluent hibernate和entity framework。但两者都不如前者。EF5不能在代码优先设置中正确使用TVF,只能在db优先设置中使用。如果没有不必要的麻烦,你不能把它们结合起来。