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

Я работаю над интернет-порталом пенни-аукциона. Я использую 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"));
} 

Что мне нужно

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


person Varun Maggo    schedule 02.04.2012    source источник
comment
Ваша процедура возвращает данные в той же форме, что и BiddersViewModel? Если да, то есть ли причина, по которой вы не заменяете «динамический» в вызове запроса на BiddersViewModel?   -  person patmortech    schedule 02.04.2012
comment
То, что сказал @patmortech, правильно. Также будьте осторожны, передавая результат запроса ‹› непосредственно в представление, поскольку тогда запрос будет выполняться только при итерации по списку элементов в представлении. Метод Fetch ‹› - гораздо лучший вариант.   -  person Schotime    schedule 03.04.2012
comment
спасибо, я попробовал, и теперь он работает!   -  person Varun Maggo    schedule 03.04.2012
comment
var context = new PetaPoco.Database (DataContext); var results = context.Fetch ‹BiddersViewModel› (; exec udsp_Bidders_SelectAll;);   -  person Varun Maggo    schedule 03.04.2012


Ответы (1)


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

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

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

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

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

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

person Robert Koritnik    schedule 03.04.2012