C# 佩塔波科+;存储过程&x2B;ViewModel+;MVC3-在存储过程中使用多表查询提取数据,并在前端使用VIEWMODEL获取数据

C# 佩塔波科+;存储过程&x2B;ViewModel+;MVC3-在存储过程中使用多表查询提取数据,并在前端使用VIEWMODEL获取数据,c#,asp.net-mvc-3,stored-procedures,petapoco,C#,Asp.net Mvc 3,Stored Procedures,Petapoco,我正在一个基于网络的便士拍卖门户网站上工作。我使用PetaPoco作为我的数据访问类库,采用Asp.net MVC 3体系结构。我面临使用存储过程拉取多表数据的问题。我已经为映射存储过程字段创建了一个视图模型POCO,这是我在前端需要的 查看模型: public class BiddersViewModel { public Guid UserId { get; set; } public String UserName { get; set; } public Date

我正在一个基于网络的便士拍卖门户网站上工作。我使用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"));
} 
public ActionResult Index()
{

var context=new PetaPoco.Database(“DataContext”); 返回视图(context.Query(“exec udsp\u Bidders\u SelectAll”); }
我需要什么
我需要通过多个联接从数据库中提取数据,并使用存储过程(使用我的视图模型类)显示在视图上。

如果存储过程返回的列名与POCO类中使用的列名相同,则可以将代码更改为:

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

var context=new PetaPoco.Database(“DataContext”); 返回视图(context.Fetch(“exec udsp_Bidders_SelectAll”); }
您的视图应该按预期工作,因为您可能有一个强类型视图,其定义的模型类型为
Ienumerable

如果存储过程返回更多在POCO视图模型类中定义的列,请不要担心。只需确保未映射的对象具有正确的名称(或使用
ColumnAttribute
将它们映射到属性)

关于
Fetch
/
Query
的区别在于,如果使用
Fetch
,您将在控制器操作中读取记录,但如果使用
Query
并将其传递给视图,您将在视图中读取记录。通常更好的做法是在控制器操作中准备数据,并在视图中使用该数据。要支持此模式,您应该在控制器操作中使用
Fetch
Query().ToList()


但是,如果由于某种原因需要在视图中操作这些结果(如果无法以任何其他方式操作),则使用
Query
并将实际枚举数传递给视图,该视图将操作结果并相应地读取它们。

您的过程是否以与BiddersViewModel相同的形式返回数据?如果是这样的话,您有没有理由不将查询调用中的“dynamic”替换为BiddersViewModel?@patmortech所说的是正确的。还要小心将查询结果直接传递到视图中,因为只有在您迭代视图中的项目列表时,它才会运行查询。Fetch方法是一个更好的选择。谢谢,我尝试了这个方法,现在它工作了!var context=new PetaPoco.Database(“DataContext”);var results=context.Fetch(“;exec udsp_Bidders_SelectAll;”);