Почему SQL-запрос из Entity Framework не отображается в профилировщике? - PullRequest
2 голосов
/ 26 октября 2011

Рассмотрим этот кусок кода:

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

Это всего лишь некоторый код для ознакомления с тем, как работает EF. По этой причине я создал несколько таблиц. Анкета со ссылкой на категорию и категория имеет ссылку на вопрос.

То, что я замечаю здесь, когда я выполняю этот код, я вижу в профилировщике только оператор выбора в вопроснике. Но мне интересно, где запрос, чтобы получить все категории и вопросы? Я не могу найти этот запрос? Я полагаю, это должно быть видно в профилировщике, верно?

EDIT: вот что я могу получить от профилировщика:

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 ]

2 голосов
/ 26 октября 2011

У вас включена отложенная загрузка?

Если отложенная загрузка не включена , я думаю, что ваша строка C # выдаст исключение.Единственный раз, когда к базе данных обращаются, это вызов FirstOrDefault .Возвращенная анкета будет содержать пустую коллекцию категорий , поскольку вы не включили их в исходный запрос.Таким образом, запрос индекса 1 должен вызвать исключение.

Если отложенная загрузка включена , строка должна работать, но это приведет к попаданию нескольких запросовбаза данных.Первый будет при вызове FirstOrDefault , второй будет при преобразовании Категории в список, а третий будет при преобразовании Вопросы в список.

Итак, если у вас включена отложенная загрузка, проверьте профилировщик на наличие дополнительных запросов после того, который вы опубликовали.

Вы можете попробовать это, если отложенная загрузка отключена:

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

Вот короткое сообщение в блоге с дополнительной информацией. Начало работы с Entity Framework 4 - отложенная загрузка

1 голос
/ 26 октября 2011

Я не уверен, что это основная причина вашей проблемы, но удалите вызовы .ToList ().вместо индексатора используйте .ElementAt ().ToList останавливает выполнение запроса как SQL-запрос и переключает вас на Linq-to-Objects

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...