自动化双嵌套IEnumerable

时间:2016-08-31 00:48:12

标签: c# asp.net asp.net-mvc linq automapper

我的情况相当复杂。 我有一个订单:

 public partial class Order
    {
        public string orderNum { get; set;}
        public ICollection<Shipment> Shipments { get; set; }
        ...
    }

我有一个观点BIGVIEW:

 public partial class BIGVIEWVM
    {
        public string orderNum { get; set;}
        public OrderDetailsVM Order { get; set; }
        public ShipmentsTableVM Shipments { get; set; }
    }

子视图ShipmentsTableVM是这样的:

public partial class ShipmentsTableVM
    {
          public string somethingelse {get;set;}
          public IEnumerable<Shipment_Table_Row_VM> Shipments{get;set;}
    }

它实际上比这更复杂,但这是最简单的问题。

我有Order,有很多Shipments。我想使用AutoMapper从ProjectToOrder进行BIGVIEW来电。整个Order被映射到OrderDetailsVM没有问题,但是,我不知道怎么做是将ICollection传递给我的ShipmentsTableVM,然后将其映射到IEnumerable。

            cfg.CreateMap<Order, BIGVIEW>()
                .ForMember(d => d.order, opt => opt.MapFrom(s => s))
                ...?

我认为我可以处理从ICollection<Shipments>ShipmentsTableVM的映射:

            cfg.CreateMap<IEnumerable<Shipment>, ShipmentsTableVM>()
                .ForMember(d => d.Shipments, opt => opt.MapFrom(s => s))
                ;

但是这不起作用 - 我得到一个关于Linq无法映射不是IEnumerable的东西的错误......但我使用的是IEnumerable,所以我不明白。我也尝试过各种其他配置,但我无法快速完成。

我正在为此寻找一个Automapper解决方案,因为我不想在我的控制器中手动执行投影。

由于

2 个答案:

答案 0 :(得分:1)

实现这一目标的方法很少,其中之一就是其中之一。

cfg.CreateMap<Shipments, Shipment_Table_Row_VM>();

cfg.CreateMap<ICollection<Shipments>, ShipmentsTableVM>()
.ConstructUsing(obj => new ShipmentsTableVM())
.ForMember(d => d.Shipments, opt => opt.MapFrom(s => s));

cfg.CreateMap<Order, BIGVIEWVM>();

答案 1 :(得分:0)

您需要将适当的模型传递给子视图。试试:

Order.Shipments

Model.Shipments