如何使用AutoMapper将多个OBJECTS映射到一个对象 – asp.net mvc 3

嗨全部/非常新的Auto-Mapper.我可以映射一对一的对象但是想知道是否可以将多个对象映射到一个对象或将多个对象映射到多个对象?

考虑我有以下情况……

用户模型

public class User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Company Company { get; set; }  // 1 user work in 1 company
    }

公司模式

public class Company
        {
            public string CompanyName { get; set; }
            public string Website { get; set; }
            public ICollection<User> Users { get; set; }  // 1 Company can have many users
        }

UserCompanyViewModel

我想在一个视图中显示用户列表及其公司详细信息..

public class UserCompanyViewModel
            {
                 public ICollection<User> Users { get; set; }
                 ppublic ICollection<Company> Companies { get; set; }   
            }

现在,是否可以在这种情况下进行映射,如果是,我可以在一个视图中显示,在编辑该视图时,我想再次使用更新的字段映射回各自的模型.

任何帮助将不胜感激…… thx

解决方法

在这种情况下,您真的使用多种(类型)对象作为源吗?从您定义的问题看,您的来源是用户列表 – 通过“我想显示用户列表及其公司详细信息”来判断.

如果是这种情况,虽然您不能隐式地执行此操作,但您可以使用TypeConverter轻松地执行地图:

Mapper.CreateMap<ICollection<User>,UserCompanyViewModel>()
      .ConvertUsing<UserCompanyViewModelConverter>();

然后将您的转换器定义为:

public class UserCompanyViewModelConverter : ITypeConverter<ICollection<User>,UserCompanyViewModel>
{
    public UserCompanyViewModel Convert(ResolutionContext context)
    {
        UserCompanyViewModel model = new UserCompanyViewModel();

        ICollection<User> sourceUsers = (ICollection<User>)context.SourceValue;

        model.Users     = sourceUsers;
        model.Companies = sourceUsers.Select(u => u.Company).Distinct().ToList();

        return model;
    }
}

然后,当您想要映射时,只需将您的用户集合用于某些用户并映射它:

UserCompanyViewModel model = Mapper.Map<ICollection<User>,UserCompanyViewModel>(someUsers);

如果您确实需要将多个源类型映射到单个目标类型,则看起来this blog post包含一个可以帮助您的简短助手类.简而言之,AutoMapper并不完全支持这一点,因此您将制作几个Map请求来填充ViewModel.您将需要使用另一个TypeConverter来确保第二个调用不会替换第一个调用添加的公司.

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...