Я новичок в 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 принимает единый объект: Ужин. На основе ужина он создает 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 в своих действиях контроллера?