我已按照文章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会产生非常复杂的查询和子查询,这在我看来是多余的,但除此之外我无法弄清楚这个查询的下划线问题是什么。
有什么想法吗?
由于
答案 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)
中所用的那样。