2015-12-11 157 views
0

要求将名称(Class A)和电话号码(Class B)映射到具有Name和PhoneNumber的Class C.一个人(姓名)可以有多个电话号码。使用Automapper将对象嵌套到一个对象

public class A 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual IList<B> B { get; set; } 
} 

public class B 
{ 
    public int A_ID { get; set; } 
    public string PhoneNumber { get; set; } 
} 

public class C 
{ 
    public string Name { get; set; } 
    public string PhoneNumber { get; set; } 
} 

得到一个类从数据库(其中有B)的细节,它需要被映射到C类

public class Activity 
{ 
    public IList<C> GetContacts(string name) 
    { 
     using (ModelEntities ctx = new ModelEntities()) 
     { 
      Mapper.CreateMap<A, C>(); 
      Mapper.CreateMap<B, C>(); 

      var result = 
       ctx.A.SingleOrDefault(ss => ss.Name == name); 

     } 
    } 
} 

谁能帮助我使用Automapper映射?

由于

+0

'一个人(姓名)可以有多个电话号码......除了没有显示任何企图,你没有描述在这种情况下应该发生什么。类'C'需要每个名字有一个数字。 – Jonesopolis

+0

C类应提供来自数据库的所有记录。如果我们有记录1. Sam | 0786878768,2. Sam | 065765768,3. Isaac | 8976897987,4.菲利普| 232342,GetContacts应该获取所有4条记录。 – Jack

+0

这没有任何意义。 C类不能提供所有的记录,'IEnumerable '也许可以,但你不能让一个实例代表多个实例。 –

回答

1

AutoMapper不能从单个实例多个实例映射。它要么必须是实例才能实例,要么可枚举才能枚举。我能看到的最佳路径是简单地将您的IList<B>映射到IList<C>,然后回填Name属性。沿线的东西:

var c = Mapper.Map<IList<C>>(a.B); 
c.ToList().ForEach(m => m.Name = a.Name); 

但是,除非你的映射是比这更复杂的hella,AutoMapper是矫枉过正。你可以简单地做:

var c = a.B.Select(b => new C { Name = a.Name, PhoneNumber = b.PhoneNumber }); 
+0

谢谢。我会试试这个。 – Jack