Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用AutoMapper映射“LinkedList”_C#_Automapper - Fatal编程技术网

C# 使用AutoMapper映射“LinkedList”

C# 使用AutoMapper映射“LinkedList”,c#,automapper,C#,Automapper,我有类似的情况。我的DTO看起来像这样- public class DTOItem { public string ID { get; set; } public int? UniqueId { get; set; } public string Payload { get; set; } //How do I ma

我有类似的情况。我的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;
    }
}
以下是代码映射:

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);

再次感谢。

无需为此使用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()
        };
}
我假设Item_ID是UID的“键”,否则只需调整MapRelated即可


一般来说,我认为AutoMapper只有在必须将非类型化数据映射到类型化数据时才有用,即使在这种情况下,在使用它之前我也会认真考虑。否则,一些LINQ代码更简单,类型更安全。

无需为此使用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()
        };
}
我假设Item_ID是UID的“键”,否则只需调整MapRelated即可


一般来说,我认为AutoMapper只有在必须将非类型化数据映射到类型化数据时才有用,即使在这种情况下,在使用它之前我也会认真考虑。否则,一些LINQ代码更简单,类型更安全。

您能给出源类以及您尝试映射的内容吗?嗨,Raphael,我已经添加了源类。这不是一个链表。。。此数据中是否有循环引用?是的,您是对的,这不是链表。它更像一棵树。不,不会有任何循环引用。RelatedSet在集合中可以有零个或多个。而且,RelatedSet集合中的项将不再具有子DTOItem。能否提供源类以及您尝试映射的内容?嗨,Raphael,我已经添加了源类。这不是一个链接列表。。。此数据中是否有循环引用?是的,您是对的,这不是链表。它更像一棵树。不,不会有任何循环引用。RelatedSet在集合中可以有零个或多个。并且,RelatedSet集合中的项将不再具有子DTOItem。还有一个类扩展了该类,该类有30多个成员,需要将值复制到其中。在本例中,列表和字符串[]等之间存在映射。您建议如何进行此操作?@user1244179:1。你的问题中没有具体说明,所以这应该是一个新问题。2.你可以只写代码,这很简单。如果您的意思是您需要在编写30行代码和破坏类型系统之间进行选择,我将选择30行代码。如果您的域中存在常见的转换,您可以将其抽象为可能的高阶函数。3.必须将许多类映射到类似的类是一种代码味道,您可能需要修改为什么需要这样做……还有一个类扩展了这个类,它有30多个成员,需要将值复制到其中。在本例中,列表和字符串[]等之间存在映射。您建议如何进行此操作?@user1244179:1。你的问题中没有具体说明,所以这应该是一个新问题。2.你可以只写代码,这很简单。如果您的意思是您需要在编写30行代码和破坏类型系统之间进行选择,我将选择30行代码。如果您的域中存在常见的转换,您可以将其抽象为可能的高阶函数。3.必须将许多类映射到类似的类是一种代码味道,您可能需要修改为什么需要这样做。。。
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);