Я новичок как в MVC, так и в Entity Framework, и у меня есть вопрос о правильном / предпочтительном способе сделать это.
Я как бы слежу за приложением Nerd Dinner MVC, когда пишу это приложение. У меня есть страница с данными из нескольких разных мест. Он показывает детали, которые поступают из нескольких разных таблиц, а также имеет раскрывающийся список из таблицы поиска.
Я создал класс ViewModel, который содержит всю эту информацию:
class DetailsViewModel {
public List<Foo> DropdownListData { get; set; }
// comes from table 1
public string Property1 { get; set; }
public string Property2 { get; set; }
public Bar SomeBarObject { get; set; } // comes from table 2
}
В коде Nerd Dinner их примеры немного слишком упрощенно. Модель DinnerFormViewModel принимает одну сущность: Dinner. На основе Dinner он создает список SelectList для стран в зависимости от местоположения ужина.
Из-за простоты их код доступа к данным также довольно прост. У него есть простой DinnerRepository с методом GetDinner (). В своих методах действий он может делать простые вещи, например:
Dinner dinner = new Dinner();
// return the view model
return View(new DinnerFormViewModel(dinner));
ИЛИ
Dinner dinner = repository.GetDinner(id);
return View(new DinnerFormViewModel(dinner));
Мой запрос намного сложнее, чем этот, извлечение из нескольких таблиц ... создание анонимного типа:
var query = from a in ctx.Table1
where a.Id == id
select new { a.Property1, a.Property2, a.Foo, a.Bar };
Мой вопрос следующий:
Как должен выглядеть мой класс репозитория? Должен ли класс репозитория возвращать саму ViewModel? Это не похоже на правильный способ делать что-то, поскольку ViewModel подразумевает, что он используется в представлении. Поскольку мой запрос возвращает анонимный объект, как мне вернуть его из моего репозитория, чтобы я мог построить ViewModel в своих действиях контроллера?