2016-12-08 9 views
0

я иметь следующую структуру сущностей, что я хочу, чтобы отобразить до DtoAutomapper ребенок отображение с объектом в середине

Контекст лиц

public class CallPoint 
{ 
    public int Id { get; set; } 
    public string Name {get; set;} 
    public ICollection {UserCallPoint} UserCallPoints {get; set;} 
} 

public class UserCallPoint 
{ 
    public int Id {get; set;} 
    public CallPoint CallPoint {get; set;} 
    public User User {get; set; 
} 

public class User 
{ 
    public int Id {get; set;} 
    public string Email {get; set;} 
    public ICollection<UserCallPoint> UserCallPoints {get; set; 
} 

DTO

public class CallPointDto 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<UserDto> Users { get; set; } 
} 

public class UserDto 
{ 
    public int Id { get; set; } 
    public string Email { get; set; } 
    public List<CallPointDto> CallPoints { get; set; } 
} 

Таким образом, в основном у меня есть много разных сопоставлений, но между ними существует сущность, которая действует как таблица поиска в основном. Как это сделать? Сейчас я просто перекручивание и отображение, как показано ниже, но это слишком медленно

private List<CallPointDto> MapCallPoint(List<CallPoint> callPoints) 
    { 
     List<CallPointDto> callPointDtos = new List<CallPointDto>(); 
     foreach (var callPoint in callPoints) 
     { 
      var callPointDto = _mapper.Map<CallPointDto>(callPoint); 
      callPointDto.Users = new List<UserDto>(); 
      foreach (var item in callPoint.UserCallPoints) 
      { 
       UserDto userDto = _mapper.Map<UserDto>(item.User); 
       callPointDto.Users.Add(userDto); 
      } 
      callPointDtos.Add(callPointDto); 
     } 
     return callPointDtos; 
    } 

Как бы я сделать это с помощью пользовательского резольвера?

+0

Я правильно понял, что 'CallPoints' на вашем' UserDto' не установлен? Это предназначено или должно быть установлено? Когда он должен быть установлен, существует вероятность, что вам нужно вызвать все «CallPoint», «UserCallPoint» и «User» из БД, потому что все они могут быть подключены. И действительно ли вы ищете CustomResolver или просто правильный способ сопоставить это? – Rabban

+0

В принципе, если я пытаюсь сопоставить его с FromMember(), я зацикливаюсь в цикле, поскольку UserDto имеет много колл с CallPointDto, поэтому, если я устанавливаю его, он будет навсегда –

+0

Это не отвечало ни на один из моих вопросов ^^ – Rabban

ответ

0

Я не могу дать вам ответ, который вы ищете из-за проблемы, что отношение n: m может работать бесконечно. Но я хотел бы предложить вам работать с различными суб-DTOS, как это:

public class CallPointBaseDto 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
public class CallPointDto : CallPointBaseDto 
{ 
    public List<UserBaseDto> Users { get; set; } 
} 

public class UserBaseDto 
{ 
    public int Id { get; set; } 
    public string Email { get; set; } 
} 
public class UserDto : UserBaseDto 
{ 
    public List<CallPointBaseDto> CallPoints { get; set; } 
} 

Mapping:

cfg.CreateMap<CallPoint, CallPointDto>() 
    .ForMember(dest => dest.Users, opt => opt.MapFrom(src => src.UserCallPoints.Select(ucp => ucp.User))); 
cfg.CreateMap<User, UserBaseDto>(); 

Недостатком этого, является, конечно, вы не имеете CallPoints в вашем UserBaseDto , но если вам это нужно, вы можете явно вызвать этого пользователя и сопоставить его другим способом.