Entity Framework проблема с отложенной загрузкой - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь создать вопросник с множественным выбором, основанный на таблицах.В каждом вопросе есть вопрос с дочерним выбором.

Когда я выполняю итерацию listOfQuestions, выполняется первый SQL.Я подумал, «включив» Варианты, что это предотвратит вторичный поиск, когда я зациклюсь на Вариантах для текущего Вопроса, но это не так.

Почему?

  var listOfQuestions = (from q in journeyEastContext.Questions.Include("Choices")
                                   orderby q.QuestionId
                                   select new
                                   {
                                       Question = q,
                                       Choices = q.Choices.OrderBy(c => c.Sequence)
                                   });


            foreach (var questionGroup in listOfQuestions)
            {

                Question question = questionGroup.Question;

                Literal paragraph = new Literal
                {
                    Text = "<P/>"
                };
                this.QuestionPanel.Controls.Add(paragraph);

                Label QuestionLabel = new Label
                {
                    Text = question.Text
                };
                this.QuestionPanel.Controls.Add(QuestionLabel);

                //var sortedChoices = from choices in question.Choices
                //                    orderby choices.Sequence
                //                    select choices;

                foreach (Choice choice in question.Choices)
                {
                    Literal carrageReturn = new Literal
                    {
                        Text = "<BR/>"
                    };
                    this.QuestionPanel.Controls.Add(carrageReturn);

                    RadioButton choiceRadioButton = new RadioButton()
                    {
                        ID = String.Format("{0},{1}", question.QuestionId, choice.ChoiceId),
                        Text = choice.Text,
                        GroupName = question.QuestionId.ToString()
                    };

                    this.QuestionPanel.Controls.Add(choiceRadioButton);
                }
            }

1 Ответ

1 голос
/ 26 марта 2012

Это связано с тем, что проекция является частью запроса.

                                   select new
                               {
                                   Question = q,
                                   Choices = q.Choices.OrderBy(c => c.Sequence)
                               });

Есть несколько способов подойти к решению, самый простой из которых будет

  var quesitonsList = (from q in journeyEastContext.Questions.Include("Choices")
                               orderby q.QuestionId).ToList();



var listOfQuestions = from q in questionsList
            Select new
                                   {
                                       Question = q,
                                       Choices = q.Choices.OrderBy(c => c.Sequence)
                                   });

Это скажет EF выполнить первый запрос (со стремительно загруженным свойством Choices).), а затем позволит вам выполнить итерацию без дополнительных запросов.

.Include и .Select не смешиваются из-за типа запроса, генерируемого в T-SQL.В основном проекции используют внутренние операторы выбора, а загруженные свойства используют денормализацию и объединения, чтобы сгладить набор записей.

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