C# 使用AutoMapper映射“LinkedList”
我有类似的情况。我的DTO看起来像这样-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
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);