Petapoco + хранимая процедура + ViewModel + MVC3 - извлечение данных с использованием множественных запросов в хранимой процедуре и выборка во внешнем интерфейсе с использованием VIEWMODEL - PullRequest
0 голосов
/ 02 апреля 2012

Я работаю над интернет-порталом аукциона. Я использую PetaPoco в качестве библиотеки классов доступа к данным с архитектурой Asp.net MVC 3. Я столкнулся с проблемой с извлечением данных из нескольких таблиц с использованием хранимой процедуры. Я создал модель представления POCO для отображения полей хранимых процедур, которые мне нужны во внешнем интерфейсе.

Посмотреть модель:

public class BiddersViewModel
{
    public Guid UserId { get; set; }
    public String UserName { get; set; }
    public DateTime LastActivityDate { get; set; }
    public int NumberOfBids { get; set; }
    public int AuctionId { get; set; }
    public int BidId { get; set; }
    public decimal BidAmount { get; set; }       
}

Контроллер

public ActionResult Index()
{
    var context = new PetaPoco.Database("DataContext");
    return View(context.Query<dynamic>("exec udsp_Bidders_SelectAll"));
} 

Что мне нужно

Мне нужно извлечь данные из базы данных с помощью нескольких объединений и отобразить их в представлении с помощью хранимой процедуры (используя класс модели моего представления).

1 Ответ

2 голосов
/ 03 апреля 2012

Если ваша хранимая процедура возвращает те же имена столбцов, которые вы используете в своем классе POCO, вы можете изменить свой код на:

public ActionResult Index()
{
    var context = new PetaPoco.Database("DataContext");
    return View(context.Fetch<BiddersViewModel>("exec udsp_Bidders_SelectAll"));
}

, и ваше представление должно работать так, как ожидается, потому что вы, вероятно, имеетепредставление строгого типа с определенным типом модели как Ienumerable<BiddersViewModel>.

Не беспокойтесь, если ваша хранимая процедура возвращает больше столбцов, которые вы определили в своем классе модели представления POCO.Просто убедитесь, что у тех, кого вы не отобразили, есть правильные имена (или используйте ColumnAttribute, чтобы сопоставить их со свойствами).

Относительно Fetch / Query разница в том, что если вы используете Fetch вы будете читать записи в действии вашего контроллера, но если вы используете Query и передадите это в ваше представление, вы будете читать записи в представлении.Обычно лучше подготовить данные в действии контроллера и использовать эти данные в представлении.Для поддержки этого паттерна вы должны либо использовать Fetch или Query<T>().ToList() в своем действии контроллера.

Но если вам нужно по каким-то причинам манипулировать этими результатами в представлении (если это невозможно сделать каким-либо другим способом)way) затем используйте Query и передайте фактический перечислитель для просмотра, который затем будет манипулировать результатами и читать их соответственно.

...