我正在开发基于网络的便士拍卖门户网站。我使用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"));
}
我需要使用多个连接从数据库中提取数据,并使用存储过程(使用我的视图模型类)在视图上显示。
答案 0 :(得分: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
并将其传递给您的视图,您将在视图中阅读记录。在控制器操作中准备数据并在视图中使用该数据通常是更好的做法。要支持此模式,您应该在控制器操作中使用Fetch
或Query<T>().ToList()
。
但是如果你需要在视图中出于某种原因操纵这些结果(如果它不能以任何其他方式完成),那么使用Query
并传递实际的枚举器来查看哪个将操纵结果并读取它们相应