2015-06-11 3 views
0

Я пытаюсь организовать сгруппированные данные в моем контроллере для использования в моем представлении.Группировка связанных с внешним ключом данных для группировки данных по названию категории в представлении


У меня есть следующее решение на месте, но я получаю следующее сообщение об ошибке:

«Там уже находится открытое DataReader, связанное с этой командой, которая должна быть закрыта первой.»


Учитывая 2 набора связанных данных: Набор вопросов и категории они принадлежат, представлены следующим классам

Category 
Question 

Я хотел бы сгруппировать вопросы по своей категории, связанным внешний ключ

categoryId 

Вот некоторые примеры данных:

Категории

category1 { Id = 1, Name = "Info about you" } 
category2 { Id = 2, Name = "Info about your pet" } 

Вопросы

question1 { categoryId = 1, Text = "What's your name?" } 
question2 { categoryId = 1, Text = "What's your age?" } 
question3 { categoryId = 2, Text = "What kind of pet do you have?" 
question4 { categoryId = 2, Text = "What color is your pet?" 

И желаемый результат HTML было бы что-то вроде

Информация о вас

  • Wh на ваше имя?
  • В каком возрасте?

Информация о вашем питомце

  • Какой домашних животных вы имеете?
  • Какой у вас домашний питомец?

Так что моя мысль поставить INFO название категории и связанные с ним вопросы в ViewModel, как показано ниже:

public class CategoriesWithQuestions() { 
    public string Name { get; set; } 
    public IEnumerable<Question> Questions { get; set; } 
} 

А потом в мой контроллер, я бы поставил данные в ViewModel с помощью запроса:

public ActionResult MyAction() { 

    var categoriesWithQuestions = 
     db.Categories() 
      .Select(category => new CategoriesWithQuestions() 
      { 
       Name = category.Name, 
       Questions = db.Questions().Where(Queryable => q.CategoryId == category.Id) 
      }); 

    return View(categoriesWithQuestions); 
} 

и используйте ViewModel в представлении, обернув его и доступ к данной категории имя свойства и Associa Ted вопросы, как Accessors в классе ViewModel:

@model IEnumerable<App.ViewModels.CategoriesWithQuestions> 

... 

@foreach (var category in Model) 
{ 
    <h3>@category.Name</h3> 
    <ul> 
    @foreach (App.Models.Question Question question in category.Questions) 
    { 
     <li>@question.Text</li> 
    } 
    </ul> 
} 

Название происходит в порядке, но ошибка случается при попытке получить доступ к Вопросы в представлении.

Открыт для идей в определении моего текущего решения или альтернативных (лучших) решений.

+1

Используйте 'MultipleActiveResultSets = true' в строке подключения. –

ответ

1

Попробуйте

public ActionResult MyAction() { 

    var categoriesWithQuestions = 
     from c in db.Categories() 
     join q in db.Questions() on c.Id equals q.CategoryId into lj 
     from q in lj.DefaultIfEmpty() 
     group new {q,c} by c into grp 
     select new CategoriesWithQuestions 
     { 
      Name = grp.Key.Name, 
      Questions = grp.Select(x=>x.q) 
     } 

    return View(categoriesWithQuestions); 
} 
Смежные вопросы