我知道有很多关于这个主题的帖子,但我找不到一个可以帮助我做我想做的事情。我知道我最终将使用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; }
}
}
这是我的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; }
}
}
这是一个查询,我要返回我想用来填充我的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
};
所以我想再做一次,不使用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
我被困在这里。 如何从查询中填充ViewModel? 然后,我如何从我的控制器调用该动作?
我希望我已经提供了足够的信息,任何帮助将不胜感激。
答案 0 :(得分: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;
作为旁注,在AutoMapper启动并运行后,这将成为一个单行程序:
var model = Mapper.Map<IEnumerable<ShippingHdr>, IEnumerable<ShippingHeaderSummaryVM>>(shipments);
同时,学习如何手动操作非常棒。手动映射模型并不会以任何方式或形式使您受益。使用AutoMapper。
答案 1 :(得分:1)
您也可以使用Linq做这样的事情......
shipments.Select(h => 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
});
请注意,虽然映射视图模型非常适合传递到视图,但在从视图模型中读取数据库时,请始终手动执行此操作。
编辑:感谢错字修正: - )