gpt4 book ai didi

c# - 使用 AutoMapper 映射 "LinkedList"

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:34 26 4
gpt4 key购买 nike

我有链表这种情况。我的 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 映射这个人?我能够映射类(class)的其他成员。数据是从另一个类的集合对象映射而来的,该集合对象具有与此类不同的一组不同的成员。

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

再次感谢。

最佳答案

无需为此使用 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 代码更简单且类型更安全。

关于c# - 使用 AutoMapper 映射 "LinkedList",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com