如何手动填充ViewModel(不使用AutoMapper!)

Ala*_*her 9 asp.net-mvc

我知道有很多关于这个主题的帖子,但我找不到一个能帮我做我想做的事.我知道我最终将使用Automapper,但在我开始玩它之前,我想学习如何手动操作.我想创建一个ViewModel,用我的实体中的值通过存储库填充它并将其发送到我的View.这听起来很简单,我正在努力完成它.我正在使用MVC 3,EF 4.3,Database First.我已经自动生成了我的课程.我发布了相关实体(这篇文章的缩写/重命名)和类,这是我到目前为止的内容:

聚合实体:装运标题

using System;
using System.Collections.Generic;

namespace My.Models
{
public partial class ShippingHdr
{
    public ShippingHdr()
    {
        this.ShippingLI = new HashSet<ShippingLI>();
    }

    public int ID { get; set; }
    public int ShipToSiteID { get; set; }
    public Nullable<System.DateTime> DateShipped { get; set; }
    public Nullable<System.DateTime> EstDeliveryDate { get; set; }
    public string FromSitePOC { get; set; }
    public Nullable<int> ShipperID { get; set; }
    public string TrackingNo { get; set; }
    public string Comments { get; set;}
    public virtual Shippers Shippers { get; set; }
    public virtual ICollection<ShippingLI> ShippingLI { get; set; }
}

}
Run Code Online (Sandbox Code Playgroud)

这是我的ViewModel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace My.Models.ViewModels
{

public class ShippingHeaderSummaryVM
{
    public int ID { get; set; }
    public string Site { get; set; }
    public Nullable<System.DateTime> DateShipped { get; set; }
    public Nullable<System.DateTime> EstDeliveryDate { get; set; }
    public string TrackingNo { get; set; }
    public string HeaderComments { get; set; }
    public string Shipper { get; set; }
    public int NumOrders { get; set; }
    public string Site { get; set; }


}
Run Code Online (Sandbox Code Playgroud)

}

这是一个查询,我要返回我想用来填充我的Viewmodel的项目.我认为最好的地方是存储库.我验证它使用LinqPad返回我想要的数据(因此缺少对我的dbContxt的引用).我只是不知道如何从查询中获取ViewModel的值:

var shipments = from h in c.ShippingHdrs
                        where (h.ShippingLI.Count > 1)
                        join
                        e in c.vHr_Employees on h.CreatedBy equals e.ID
                        join
                        s in c.Shippers on h.ShipperID equals s.ShipperID
                        join
                        r in vAaiomsSites on h.ShipToSiteID equals r.SiteID

                        select new
                        {
                            h.ID,
                            r.Site,
                            h.EstDeliveryDate,
                            h.DateShipped,
                            h.TrackingNumber,
                            h.HeaderComments,
                            e.LastName,
                            h.ShippingLI.Count,
                            s.Shipper
                                                        };
Run Code Online (Sandbox Code Playgroud)

所以我想要做的是,再次使用Automapper,就是使用ShippingHdr实体中的所有行填充ViewModel并将其传递给我的视图.

以下是需要映射的文件结构:

ShippingHeaderSummaryVM从货件映射

ID = h.ID
Site = r.Site
DateShipped = h.DateShipped
EstDeliveryDate = h.EstDeliveryDate
TrackingNo = h.TrackingNumber
FromSitePOC = e.LastName
NumOrders = h.ShippingLI.Count
Shipper = s.Shipper
HeaderComments = h.HeaderComments
Run Code Online (Sandbox Code Playgroud)

我被困在这里.如何从查询中填充ViewModel?然后,我如何从我的控制器调用该动作?

我希望我已经提供了足够的信息,任何帮助将不胜感激.

Jes*_*sse 5

为了填充基于您的视图模型对象上出货量的列表,你需要创建一个映射方法,从您的从数据库根据您的视图模型的出货量的集合出货的集合映射:

var model = new List<ShippingHeaderSummaryVM>();

foreach(var h in shipments)
{

    var viewModel = new ShippingHeaderSummaryVM
    {
    ID = h.ID
    Site = r.Site
    DateShipped = h.DateShipped
    EstDeliveryDate = h.EstDeliveryDate
    TrackingNo = h.TrackingNumber
    FromSitePOC = e.LastName
    NumOrders = h.ShippingLI.Count
    Shipper = s.Shipper
    HeaderComments = h.HeaderComments
    }

    model.Add(viewModel);
}

return model;
Run Code Online (Sandbox Code Playgroud)

作为旁注,在AutoMapper启动并运行后,这将成为一个单行程序:

var model = Mapper.Map<IEnumerable<ShippingHdr>, IEnumerable<ShippingHeaderSummaryVM>>(shipments);
Run Code Online (Sandbox Code Playgroud)

同时,学习如何手动操作非常棒.手动映射模型并不会以任何方式或形式使您受益.使用AutoMapper.