为什么实体框架中的SQL查询在Profiler中不可见?

时间:2011-10-26 14:22:33

标签: c# winforms entity-framework

考虑这段代码:

var question = context.Questionnaires.FirstOrDefault(q => q.id == 169).Categories.ToList()[1].Questions.ToList()[0];

这只是让我熟悉EF工作方式的一些特殊代码。因此,我创建了几个表。提及类别和类别的问卷参考了问题。

当我执行此代码时,我在这里注意到,我在分析器中只看到问卷的select语句。但我想知道,获取所有类别和问题的查询在哪里?我找不到这个查询?我认为这必须在探查器中可见,对吗?

编辑: 这是我从分析器中得到的:

SELECT TOP (1) 
[Extent1].[id] AS [id], 
[Extent1].[actualFrom] AS [actualFrom], 
[Extent1].[name] AS [name], 
[Extent1].[version] AS [version], 
[Extent1].[startDate] AS [startDate], 
[Extent1].[endDate] AS [endDate], 
[Extent1].[description] AS [description], 
[Extent1].[createdOn] AS [createdOn], 
[Extent1].[createdBy] AS [createdBy], 
[Extent1].[showQuestionCode] AS [showQuestionCode], 
[Extent1].[font] AS [font], 
[Extent1].[removed] AS [removed], 
[Extent1].[showAchievementsAppointmentTab] AS [showAchievementsAppointmentTab], 
[Extent1].[showConceptTabs] AS [showConceptTabs], 
[Extent1].[f_QuestionnaireBuilder_QuestionnaireType_Id] AS [f_QuestionnaireBuilder_QuestionnaireType_Id], 
[Extent1].[f_QuestionnaireBuilder_Status_Id] AS [f_QuestionnaireBuilder_Status_Id], 
[Extent1].[f_QuestionnaireBuilder_Questionnaire_ParentId] AS [f_QuestionnaireBuilder_Questionnaire_ParentId], 
[Extent1].[f_QuestionnaireBuilder_QuestionnaireCategory_Id] AS [f_QuestionnaireBuilder_QuestionnaireCategory_Id], 
[Extent1].[f_Careplan_VisionModel] AS [f_Careplan_VisionModel]
FROM [implementation].[QuestionnaireBuilder_Questionnaire] AS [Extent1]
WHERE 169 = [Extent1].[id]

2 个答案:

答案 0 :(得分:2)

您是否启用了延迟加载?

如果延迟加载启用,我认为您的C#行将抛出异常。数据库被击中的唯一时间是调用 FirstOrDefault 。返回的调查问卷将包含类别的空集合,因为您未在原始查询中包含它们。因此,请求 1 的索引应该抛出异常。

如果启用延迟加载 ,则该行应该有效,但会导致多次查询到达数据库。第一个是在 FirstOrDefault 的调用,第二个是将类别转换为列表,第三个是转换为问题到列表。

因此,如果您启用了延迟加载,请在发布者之后检查探查器以获取其他查询。

如果禁用延迟加载,您可以尝试这样做:

var question = context.Questionnaires.
               Include("Categories.Questions").
               FirstOrDefault(q => q.id == 169).
               Categories.ToList()[1].
               Questions.ToList()[0];

这是一篇简短的博客文章,其中包含更多信息。 Getting Started with Entity Framework 4 – Lazy Loading

答案 1 :(得分:1)

我不确定这是否是您问题的根本原因但是删除.ToList()调用。而不是索引器,使用.ElementAt()。 ToList阻止查询作为SQL查询执行,而是将您切换到Linq-to-Objects