Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 实体框架、全文搜索和临时表_Sql Server_Entity Framework_Full Text Search_Temp Tables - Fatal编程技术网

Sql server 实体框架、全文搜索和临时表

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插入到

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

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

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


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

我想我可能会建议使用混合方法

  • 编写一个存储过程,返回所需的所有信息
  • 将实体映射到结果。该实体可仅为此目的创建。或者,使用Entity Framework的版本4,它允许映射复杂类型以启动过程结果。关键是,我们不再试图将过程结果强制为现有的实体类型,而是将它们作为自己的类型处理
  • 现在可以构建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优先设置中使用。如果没有不必要的麻烦,你不能把它们结合起来。