sql索引查询的EF转换
我有一个包含3个非聚集索引的表,但当我尝试使用EF执行查询时,如sql索引查询的EF转换,sql,sql-server,entity-framework,indexing,Sql,Sql Server,Entity Framework,Indexing,我有一个包含3个非聚集索引的表,但当我尝试使用EF执行查询时,如 entitiesQueryable = entitiesQueryable .Where(e => e.Value.ToLower().Contains(model.Value.ToLower())); Ef将查询转换为 SELECT [Extent1].[Id] AS [Id], [Extent1].[EntityType] AS [EntityType], [Extent1].[E
entitiesQueryable = entitiesQueryable
.Where(e => e.Value.ToLower().Contains(model.Value.ToLower()));
Ef将查询转换为
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'
指数将被认可。检查
我怎样才能避免这种情况?感谢您的帮助。要提高性能,您在这里可以做的唯一一件事就是启用全文搜索并创建特别感谢,我找到了最适合自己的解决方案。EF确实不习惯将索引与
CHARINDEX
操作符一起使用,但索引与类似,可以很好地工作,所以我将过滤器改为
entitiesQueryable = entitiesQueryable
.Where(e => e.Value.Contains(model.Value));
转换为哪个EF
WHERE [Extent1].[Value] LIKE 'Varyence' ESCAPE N'~'
我认为真正的问题是你在做一个ToLower(),它阻止了索引的使用
默认情况下,SQL Server不区分大小写,因此您不需要在任何查询中写入ToLower()。您如何想象contains运算符的索引结构?抱歉,不理解你的问题。简短回答:不可能使用包含运算符的索引,也不可能将mysql标记更正为sql server,因为你使用的是SSM。实际上,与原始代码相比,我看不到你的C#代码有任何变化。sql现在使用索引的唯一原因是因为您的like表达式在这个formI中只等于“=”运算符,我明白了。但EF将.Contains转换为不带“%”的LIKE真的很奇怪……是的,但它可以工作。可能是sql分析器中的问题:)