我有一个包含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
并且它不会使用我的索引!
但如果我改变过滤器类型:
WHERE [Value] = 'Varyence'
索引将被识别。检查
我该如何避免这种情况?谢谢你的帮助。
答案 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()。