2016-04-12 2 views
2

У меня есть класс источника, какКак правильно использовать ForMember внутри коллекции?

public class SourceEmployee 
    { 
     public int EmployeeID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public List<ResidentialAddress> EmployeeResidences { get; set; } 
    } 

и ResidentialAddress как под

public class ResidentialAddress 
    { 
     public string State { get; set; } 
     public string City { get; set; } 
     public int ZipCode { get; set; } 

    } 

Destination класс как под

public class DestinationEmployee 
{ 
     public int EmployeeID { get; set; } 
     public string FullName { get; set; }  
     public List<ResidentialAddress1> Address { get; set; } 

} 

public class ResidentialAddress1 
{ 
    public string FullAddress { get; set; } 
} 

Как выполнить ForMember для FullAddress, который будет State + City + ZipCode?

Я потерял после

Mapper.CreateMap<SourceEmployee, DestinationEmployee>(); 

Mapper.CreateMap<SourceEmployee, DestinationEmployee>(). 
ForMember(f => f.FullName, f => f.MapFrom(a => string.Concat(a.FirstName, " ", a.LastName))) 
.ForMember(x => x.EmployeeResidences1, x => x.MapFrom(y => string.Concat(y.EmployeeResidences.m, " ", y.LastName))); 

ответ

1

Вы должны иметь отдельный профиль карты для вашего ResidentialAddress -> ResidentialAddress1 трансформации. Когда родительский объект будет преобразован с помощью automapper, все дочерние объекты трансформируются с помощью определенных профилей карты:

Mapper.CreateMap<SourceEmployee, DestinationEmployee>() 
    .ForMember(f => f.FullName, f => f.MapFrom(a => string.Concat(a.FirstName, " ", a.LastName))) 
    .ForMember(x => x.Address, x => x.MapFrom(y => y.EmployeeResidences))); 

Mapper.CreateMap<ResidentialAddress, ResidentialAddress1> 
    .ForMember(x => x.FullAddress, map=>map.From(from => string.Format("{0} {1} {2}", from.State, from.City, from.ZipCode); 

Таким образом, если в коде вам придется преобразовать ResidentialAddress в ResidentialAddress1 в нескольких местах, вы не будете иметь чтобы добавить любой код, просто используйте Mapper.Map<>.

Я также предлагаю вам перейти на профили, вместо того, чтобы определять конфигурацию вашего картографа inline: https://github.com/AutoMapper/AutoMapper/wiki/Configuration

2

Ну, вы можете использовать LINQ, чтобы AutoMapper узнать, как отобразить 3 свойства в одно свойство, и вы не должны реально использовать Mapper.CreateMap() как это осуждается и не будет поддерживаться с версии 5.0 - вместо этого используйте Mapper.Initialize().

Давайте посмотрим на этот пример:

  Mapper.Initialize(cfg => 
      { 
       cfg.CreateMap<SourceEmployee, DestinationEmployee>(); 

       cfg.CreateMap<SourceEmployee, DestinationEmployee>() 
       .ForMember(f => f.FullName, f => f.MapFrom(a => string.Concat(a.FirstName, " ", a.LastName))) 
       .ForMember(
        x => x.Address, 
        x => x.MapFrom(
         y => y.EmployeeResidences.Select(
          r => new ResidentialAddress1() 
          { 
           FullAddress = String.Concat(
            r.State, " ", r.City, " ", r.ZipCode) 
          }).ToList())); 
      }); 

      SourceEmployee emp = new SourceEmployee() 
      { 
       EmployeeID = 1, 
       FirstName = "Alex", 
       LastName = "Green", 
       EmployeeResidences = new List<ResidentialAddress>() 
       { 
        new ResidentialAddress() { State = "abc", City = "def", ZipCode = 110 }, 
        new ResidentialAddress() { State = "foo", City = "qwe", ZipCode = 220 }, 
        new ResidentialAddress() { State = "bar", City = "ert", ZipCode = 330 }, 
       } 
      }; 

      var sourceEmp = Mapper.Map<SourceEmployee, DestinationEmployee>(emp); 

      Console.WriteLine(sourceEmp.Address.Count);  
      Console.WriteLine(sourceEmp.Address[1].FullAddress); 

Выход:

3 
foo qwe 220