很奇怪"不能在列'名称'上使用CONTAINS或FREETEXT谓词。因为它不是全文索引的。"错误

时间:2017-01-26 11:25:13

标签: sql-server entity-framework

我已按照文章here实施了使用实体框架的全文搜索。

我的表单中有两个搜索框。一个用于搜索,可用于名称和号码,另一个搜索框用于搜索地址。

我从sql server获得的一些奇怪的错误消息如下:

  

不能在列'名称'上使用CONTAINS或FREETEXT谓词因为   它不是全文索引。

但这个错误令人误解。这不是真正的问题。我已经创建了全文搜索,并在目录中添加了名称,编号和地址。

然后我运行Sql profiler来获取由EF生成的实际SQL查询,如下所示:

SELECT 
[Project1].[Id] AS [Id], 
[Project1].[Name] AS [Name], 
[Project1].[Number] AS [Number],
[Project1].[Address] AS [Address]
FROM ( SELECT 
    [Filter1].[Id1] AS [Id], 
    [Filter1].[Name] AS [Name], 
    [Filter1].[Number] AS [Number],
    [Filter1].[Address] AS [Address]
    FROM (SELECT 
    [Extent1].[Id] AS [Id1],
    [Extent1].[Name] AS [Name],
    [Extent1].[Number] AS [Number],
    [Extent1].[Address] AS [Address] FROM [dbo].[Company] AS [Extent1]
        INNER JOIN [dbo].[Status] AS [Extent2] ON [Extent1].[CompanyStatusId] = [Extent2].[Id]
        INNER JOIN [dbo].[Category] AS [Extent4] ON [Extent1].[CategoryId] = [Extent4].[Id]
        WHERE [Extent1].[CategoryId] IN (1) ) AS [Filter1]

    WHERE ((contains([Name],'test')) OR (contains([Number], 'test'))) AND (contains([Address], 'blah'))
)  AS [Project1]
ORDER BY [Project1].[Number] ASC
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY 

当我运行查询时,我得到了同样的错误。我无法弄清楚这个查询的实际问题在哪里。

我不确定为什么EF会产生非常复杂的查询和子查询,这在我看来是多余的,但除此之外我无法弄清楚这个查询的下划线问题是什么。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

我在使用您链接的FtsInterceptor代码时遇到此错误,但仅当使用加入了足够表的查询才能使contains子句引用[Filter]列时,如(contains([Filter1].[Title], @p__linq__0)中所示。由于某种原因,您的查询并未在contains函数中包含列名,但是从嵌套中看,它看起来可能会推断出[Filter1]别名。

无论如何,似乎为我解决的问题是将Contains子句(即query.Where(s => s.Title.Contains(fts)))移动到查询的最顶层,以便它是第一个子句。这改变了它使用[Extent1]表,如(contains([Extent1].[Title], @p__linq__0)中所用的那样。