用sql索引转换查询的EF

时间:2016-10-11 13:34:49

标签: sql sql-server entity-framework indexing

我有一个包含3个非聚集索引的表,但是当我尝试使用EF执行查询时,例如

entitiesQueryable = entitiesQueryable
                .Where(e => e.Value.ToLower().Contains(model.Value.ToLower()));

将查询转换为

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[EntityType] AS [EntityType], 
[Extent1].[EntitySubType] AS [EntitySubType], 
[Extent1].[Value] AS [Value]
FROM [dbo].[FOMEntity2] AS [Extent1]
WHERE (CAST(CHARINDEX(LOWER('Varyence'), LOWER([Extent1].[Value])) AS int)) > 0

并且它不会使用我的索引!

Query without indexes

但如果我改变过滤器类型:

 WHERE [Value] = 'Varyence'

索引将被识别。检查

Query with index

我该如何避免这种情况?谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

您可以在此处提高性能的唯一方法是启用全文搜索并创建fulltext index

答案 1 :(得分:0)

特别感谢Konstantin Ershov,我找到了最适合我的解决方案。 EF真的不会使用CHARINDEX运算符的索引,但索引与LIKE一起工作正常,所以我将我的过滤器更改为

entitiesQueryable = entitiesQueryable
                .Where(e => e.Value.Contains(model.Value));

哪个EF转换为

  WHERE [Extent1].[Value] LIKE 'Varyence' ESCAPE N'~'

答案 2 :(得分:0)

我认为真正的问题是你正在做一个ToLower(),它阻止了索引的使用。

默认情况下,SQL Server不区分大小写,因此您无需在任何查询中编写ToLower()。