实体框架,全文搜索和临时表

时间:2009-09-18 14:03:47

标签: sql-server entity-framework full-text-search temp-tables

我有一个LINQ-2-Entity查询构建器,根据相当复杂的搜索表单嵌套不同种类的Where子句。到目前为止工作得很好。

现在我需要在一些查询中使用SQL Server全文搜索索引。是否有机会将搜索词直接添加到LINQ查询中,并将分数作为可选属性提供?

如果没有,我可以编写一个存储过程来加载与全文搜索条件匹配的所有行ID的列表,然后使用LINQ-2-Entity查询加载详细数据并评估其他可选的过滤条件< em>每行循环。这在性能方面当然是个坏主意。

另一种选择是使用存储过程将匹配全文搜索的所有行ID插入临时表,然后让LINQ查询加入临时表。问题是:如何在LINQ查询中加入临时表,因为它不能是实体模型的一部分?

2 个答案:

答案 0 :(得分:2)

我想我可能会提出一种混合方法。

  1. 编写一个存储过程,返回所需的所有信息。
  2. 将实体映射到结果。可以为此唯一目的创建实体。或者,使用实体框架的第4版,它允许映射复杂类型以启动过程结果。关键是,不是试图强制程序导致现有实体类型,而是将它们作为自己的类型处理。
  3. 现在您可以构建LINQ to Entities查询。
  4. 示例查询:

    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更简单。