Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql索引查询的EF转换_Sql_Sql Server_Entity Framework_Indexing - Fatal编程技术网

sql索引查询的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

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

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分析器中的问题:)