使用AutoMapper从列表向下映射到对象

时间:2010-08-12 19:35:39

标签: automapper

我是AutoMapper的新手,我正试图解决这个问题。

如果我有这样的源类:

public class Membership
{
    public int MembershipId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string OrganizationName { get; set; }
    public List<Address> Addresses { get; set; }
}

Address类看起来像这样:

public class Address
{
    public int AddressId{ get; set; }
    public int RefAddressTypeId { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public bool IsPreferredAddress { get; set; }
}

我的目的地类是:

public class UserInformationModel
{
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Organization { get; set; }
    public string EmailAddress { get; set; }
    public PhysicalAddress BillingAddress { get; set; }
    public PhysicalAddress ShippingAddress { get; set; }
}

目的地地址类是:

public class PhysicalAddress
{
    public AddressType AddressType{get; set;}
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }

}

我已经设置了这样的映射:

Mapper.CreateMap<MinistryMattersIntegration.BusinessObjects.Entities.Cokesbury.Membership, UserInformationModel>()
      .ForMember(dest => dest.Organization, opt => opt.MapFrom(src=>src.OrganizationName));

这适用于UserInformationModel的Membership,但现在我需要让地址工作。但需要注意的一件重要事情是,目的地是单个帐单地址和单个送货地址,而在原始模型中,所有地址都存储为列表。通过查看RefAddressTypdId和IsPreferredAddress,您可以从列表中找到送货地址和帐单地址的方式。只有一个首选地址可能与特定的RefAddressTypeId一起存在。

所以,我的问题是,你如何让AutoMapper进行这种映射?是否有可能,或者我最好使用常规映射代码?

1 个答案:

答案 0 :(得分:7)

您需要使用AutoMapper的Custom Value Resolvers功能。因此,您需要使用IsPreferredAddress标志设置自定义解析器以从列表映射到单个实体以查找它。

文档非常适合自定义解析器,所以你应该很好地从那里搞清楚。