0

我在 C# 中从实体框架调用 SQL Server 10,并希望在请求中获得查询提示。数据库具有在 Management Studio 中运行的 SQL 正常运行的索引,但是当使用 Visual Studio 中的实体框架从 C# 调用命令时,查询计划程序在已经存在索引时选择完全扫描。

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

data.attributeText = data.vegaDB.attributeText.AsExpandable().Where(parentPredicate.Compile()).ToList();

whereparentPredicate是动态生成的,相当于:

(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]

因此,用在初始 c# 调用中执行查询提示的一些额外命令替换直接 sql 调用使用[Extent1]的 index[IX_parentID]似乎是解决方案。我环顾四周,但还没有成功。知道如何提出问题吗?

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

4

2 回答 2

0

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

于 2012-11-19T11:43:43.087 回答
0

运行 SQL 跟踪以找出实际为此语句生成的 SQL 查询。

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

如果确实出现,那么您需要通过索引调整向导或类似工具运行该查询。

如果不是,那是您的问题 - 这意味着 Entity Framework 正在将整个表加载到内存中并应用谓词本身。

更新后我很确定这正是发生的情况: AsExpandable() 无法将您的谓词转换为 SQL,因此它正在生成代码以读取整个表,然后将谓词应用于返回的数据。

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

于 2011-03-01T17:51:30.957 回答