Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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
C# 强制提示从实体框架索引到SQL Server_C#_Sql Server_Entity Framework 4_Sql Execution Plan_Hint - Fatal编程技术网

C# 强制提示从实体框架索引到SQL Server

C# 强制提示从实体框架索引到SQL Server,c#,sql-server,entity-framework-4,sql-execution-plan,hint,C#,Sql Server,Entity Framework 4,Sql Execution Plan,Hint,我正在从C中的Entity Framework调用SQL Server 10,希望在请求中获得查询提示。数据库中的索引通常是从ManagementStudio中运行的SQL中运行的,但是当在VisualStudio中使用EntityFramework从C调用命令时,查询计划器会在已经存在索引时选择完全扫描 我正在创建动态谓词,以以下形式请求数据: data.attributeText = data.vegaDB.attributeText.AsExpandable().Where(parentP

我正在从C中的Entity Framework调用SQL Server 10,希望在请求中获得查询提示。数据库中的索引通常是从ManagementStudio中运行的SQL中运行的,但是当在VisualStudio中使用EntityFramework从C调用命令时,查询计划器会在已经存在索引时选择完全扫描

我正在创建动态谓词,以以下形式请求数据:

data.attributeText = data.vegaDB.attributeText.AsExpandable().Where(parentPredicate.Compile()).ToList();
其中,parentPredicate是动态生成的,等效于:

(parentID = p1) AND (attributeName = 'name OR ... ')          
SQL Server查询计划从中生成:

SELECT 
[Extent1].[attributeID] AS [attributeID],  
[Extent1].[parentID] AS [parentID],  
[Extent1].[typeID] AS [typeID],  
[Extent1].[attributeName] AS [attributeName],  
[Extent1].[attributeData] AS [attributeData]  
FROM [dbo].[attributeText] AS [Extent1]
因此,用直接sql调用使用的索引[IX_parentID]替换[Extent1],用一些额外的命令在初始c调用中执行查询提示似乎是解决方案。我环顾了一下四周,但还没有成功。你知道如何界定这个问题吗


您认为这是正确的解决方案吗?

运行SQL跟踪,以了解此语句实际生成的SQL查询

您的谓词或等效项是否实际出现在SQL Server看到的查询中

如果确实出现,则需要通过索引优化向导或类似工具运行该查询

如果没有,那就是您的问题了——这意味着实体框架正在将整个表加载到内存中,并应用谓词本身

更新我很确定最后一个就是正在发生的事情:AsExpandable无法将谓词转换为SQL,因此它生成代码来读取整个表,然后将谓词应用于返回的数据


解决方案是停止使用AsExpandable,改用AsQueryable。使用AsExpandable的唯一原因是如果AsQueryable不提供您需要的功能,我认为这里不是这种情况。

尝试更新数据库中相关表的统计信息,如果统计信息过时,可能会对所有查询使用非优化查询计划。

如果查询优化器选择完整表扫描,它可能有很好的理由这样做;表格可能太小而无关紧要,索引可能选择性不够,统计数据可能过时。。。。。。我会调查原因,而不是直接强制执行查询提示…..我已经按照中的建议运行了query Analyzer,它对设置很满意sql命令将选择完全扫描而不是索引,如果索引对搜索方法的改进不会超过30%,您是对的,AsExpandable正在将表拉到内存中,我的误解。我已经改为AsQueryable,内存使用量大大减少,尽管它仍然无法获取索引。我尝试使用虚拟动态谓词来确保没有编码错误,并将查询简化为以下内容:parentPredicate=p=>p.parentID.Equals100000;data.attributeText=data.vegaDB.attributeText.AsQueryable.WhereparentPredicate.Compile.ToList­;SQL跟踪仍在调用SELECT[Extent1].[attributeID]AS[attributeID]等,因此生成的查询中仍然没有where子句?Ben,非常感谢您的帮助。当EF使用.compile构建LinqKit时使用的.invoke调用出现问题时,需要切换到AsQueryable,并从LinqKit切换到as-Seek实体框架。因此,当调用被更改时,它工作得很好:data.attributeText=data.vegaDB.attributeText.AsQueryable.WhereparentPredicate.ToList;删除.Compile。我不知道引擎盖下到底发生了什么,但它起作用了!