4

我有一个 LINQ-2-Entity 查询生成器,根据相当复杂的搜索表单嵌套不同类型的 Where 子句。到目前为止效果很好。

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

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

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

4

2 回答 2

2

我想我可能会建议一种混合方法。

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

示例查询:

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 系统,它可以在构建索引时进行“特殊”的按类型过滤。

于 2009-09-18T14:22:18.213 回答
0

我见过这样的 EF4 代码:

var query = context.ExecuteStoreQuery<Person>(
        "SELECT * FROM People WHERE FREETEXT(*,{0})", 
        searchText
    ).AsQueryable();

在某些情况下,这可能比创建存储过程或 UDP 更简单。

于 2011-05-25T19:09:36.053 回答