2012-05-18 2 views
5

EDIT: заголовок неправильный, я пытаюсь отобразить из исходного списка в исходный список вложенной модели.Карта AutoMapper из исходной вложенной коллекции в другую коллекцию

У меня возникли проблемы с попыткой сопоставить список с другим, указанным в вложенной модели. Вид и несплошность. Проблема в том, что я не знаю, как делать сопоставления.

Вот мой набор вверх следовали моей неудачной попытке отображения:

public class DestinationModel 
{ 
    public DestinationNestedViewModel sestinationNestedViewModel { get; set; } 
} 

public class DestinationNestedViewModel 
{ 
    public List<ItemModel> NestedList { get; set; } 
} 

public class SourceModel 
{ 
    public List<Item> SourceList { get; set; } 
} 

Где товар и ItemModel уже отображение, определенный между ними

Я не могу сделать это таким образом ...

Mapper.CreateMap<SourceModel, DestinationModel>() 
.ForMember(d => d.DestinationNestedViewModel.NestedList, 
    opt => opt.MapFrom(src => src.SourceList)) 

ОШИБКА:

Выражение «d => d.DestinationNestedViewMode l.NestedList»должен решить имя member.Parameter верхнего уровня: lambdaExpression

Затем я попробовал что-то вроде этого:

.ForMember(d => d.DestinationNestedViewModel, 
o => o.MapFrom(t => new DestinationNestedViewModel { NestedList = t.SourceList })) 

Проблемы есть NestedList = t.SourceList. Они содержат разные элементы, ItemModel и Позиция соответственно. Поэтому их нужно сопоставить.

Как это сделать?

+0

Я не уверен, если я правильно понимаю , но я думаю, вам нужно создать сопоставление от Item to ItemModel, поэтому AutoMapper знает, как сопоставить объекты Item объектам ItemModel. –

+0

Существует сопоставление, которое уже определено между Item и ItemModel, но отображение не запускается, потому что NestedList принадлежит DestinationModel , который, в свою очередь, принадлежит DestinationNestedViewModel. Automapper не может обрабатывать 2 уровня моделей при сопоставлении (по крайней мере, не так, как я это пробовал). – getit

ответ

11

Я думаю, что вы хотите что-то вроде этого:

Mapper.CreateMap<Item, ItemModel>(); 

/* Create a mapping from Source to Destination, but map the nested property from 
    the source itself */ 
Mapper.CreateMap<SourceModel, DestinationModel>() 
    .ForMember(dest => dest.DestinationNestedViewModel, opt => opt.MapFrom(src => src)); 

/* Then also create a mapping from Source to DestinationNestedViewModel: */ 
Mapper.CreateMap<SourceModel, DestinationNestedViewModel>() 
    .ForMember(dest => dest.NestedList, opt => opt.MapFrom(src => src.SourceList)); 

Тогда все, что вы должны сделать, это вызов Mapper.Map между Source и Destination:

Mapper.Map<SourceModel, DestinationModel>(source); 
+0

сначала сопоставьте коллекции обоих объектов .. затем определите отображения для отдельных объектов внутри этих коллекций .. automapper так круто – hanzolo

Смежные вопросы