Сопоставление «LinkedList» с AutoMapper - PullRequest
2 голосов
/ 02 марта 2012

Я связал список видов ситуаций. Мой DTO выглядит так -

public class DTOItem
{
    public string ID
    {
        get;
        set;
    }

    public int? UniqueId
    {
        get;
        set;
    }

    public string Payload
    {
        get;
        set;
    }

    //How do I map this guy? It is list of same type.
    public List<DTOItem> RelatedItems
    {
        get;
        set;
    }
}

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

public List<DTOItem> RelatedItems
{
    get;
    set;
}

Заранее спасибо.

ОБНОВЛЕНИЕ: вот код - Рафаэль, вот код:

Исходные объекты:

public class ResultsSet
{
    public int? ResultId
    {
        get;
        set;
    }

    public int UID
    {
        get;
        set;
    }

    //Returns large XML string
    public string ResultBlob
    {
        get;
        set;
    }

    public RelatedItems[] RelatedSet
    {
        get;
        set;
    }
}

public class RelatedItems
{
    public int Item_ID
    {
        get;
        set;
    }

    public int Relationship_ID
    {
        get;
        set;
    }

    public string Description
    {
        get;
        set;
    }
}

Для сопоставления вот код:

Mapper.CreateMap<ResultSet, DTOItem>()
            .ForMember(dest => dest.ID, opt => opt.MapFrom(src => src.ResultID.GetValueOrDefault(0)))
            .ForMember(dest => dest.UniqueId, opt => opt.MapFrom(src => src.UID))
            .ForMember(dest => dest.Payload, opt => opt.MapFrom(src => src.ResultBlob));

            /*
                How do I map RelatedSet to RelatedItems here?
            */

Mapper.Map(result, returnResult);

Еще раз спасибо.

1 Ответ

0 голосов
/ 15 марта 2012

Нет необходимости использовать AutoMapper для этого. Для нециклических, относительно плоских данных это должно сделать:

static Func<RelatedItems, DTOItem> MapRelated(IEnumerable<ResultsSet> all) {
    var map = MapResultSet(all);
    return relatedItem => map(all.First(x => x.UID == relatedItem.Item_ID));
}

static Func<ResultsSet, DTOItem> MapResultSet(IEnumerable<ResultsSet> all) {
    return s => 
        new DTOItem {
            ID = s.ResultId.GetOrElse(0).ToString(),
            UniqueId = s.UID,
            Payload = s.ResultBlob,
            RelatedItems = (s.RelatedSet ?? new RelatedItems[0]).Select(MapRelated(all)).ToList()
        };
}

Пример использования:

var data = new[] { 
    new ResultsSet {
        UID = 1,
        RelatedSet = new[] {
            new RelatedItems { Item_ID = 2 },
            new RelatedItems { Item_ID = 3 },
        },
    },
    new ResultsSet {
        UID = 2,
    },
    new ResultsSet {
        UID = 3,
    },
};
var items = data.Select(MapResultSet(data)).ToList();
Debug.Assert(items.Count == 3);
Debug.Assert(items[0].UniqueId == 1);
Debug.Assert(items[1].UniqueId == 2);
Debug.Assert(items[2].UniqueId == 3);
Debug.Assert(items[0].RelatedItems.Count == 2);
Debug.Assert(items[0].RelatedItems[0].UniqueId == items[1].UniqueId);
Debug.Assert(items[0].RelatedItems[1].UniqueId == items[2].UniqueId);

Я предположил, что Item_ID является «ключом» к UID, в противном случае просто настройте MapRelated.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...