0

我正在开发一个基于网络的便士拍卖门户。我使用 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"));
} 

我需要的

我需要从具有多个连接的数据库中提取数据并使用存储过程(使用我的视图模型类)显示在视图上。

4

1 回答 1

2

如果您的存储过程返回的列名与您在 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并将其传递给您的视图,您将在视图中读取记录。在控制器操作中准备数据并在视图中使用该数据通常是一种更好的做法。要支持这种模式,您应该使用FetchQuery<T>().ToList()在您的控制器操作中。

但是,如果您出于某种原因需要在视图中操作这些结果(如果不能以任何其他方式完成),则使用Query并将实际枚举器传递给视图,然后视图将操作结果并相应地读取它们。

于 2012-04-03T10:24:32.730 回答