2011-10-26 53 views
2

考慮這段代碼:爲什麼實體框架中的SQL查詢在分析器中不可見?

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

這僅僅是我得到的EF如何工作的熟悉一些excerise代碼。所以出於這個原因,我創建了幾個表格。參考類別和類別的問卷有對問題的參考。

我在這裏注意到當我執行這段代碼時,我在調查問卷中只看到了調查問卷的select語句。但我想知道,查詢的位置和問題在哪裏?我找不到這個查詢?我認爲這個必須在profiler中可見,對吧?

編輯: 這是我從分析器獲得:

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

你可以顯示你能用探查器嗅探的SELECT嗎? –

+0

我修改了我的帖子 – Martijn

+0

將分析器擱置一會兒,這段代碼是否會返回預期結果? –

回答

1

我不知道,如果這是你的問題的根本原因,但除去.ToList()調用。而不是索引器,請使用.ElementAt()。 ToList停止將查詢作爲SQL查詢執行,而是將您切換到Linq-to-Objects

2

您是否啓用了延遲加載?

如果延遲加載是而不是啓用,我認爲你的C#行會拋出異常。數據庫唯一被擊中的時間是FirstOrDefault。返回的問卷將具有類別的空集合,因爲您沒有將它們包括在原始查詢中。因此,請求索引應引發異常。

如果延遲加載啓用,那麼該行應該工作,但它會導致多個查詢命中數據庫。第一個將在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

+0

THnx,啓用延遲加載。當我看起來更好時,我看到其他查詢是使用RPC請求發送的,而第一次請求是普通的sql命令。 – Martijn