考虑这段代码:
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]
答案 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