簡體   English   中英

Automapper Map 嵌套列表 Object 到相同的 Object 作為父

[英]Automapper Map Nested List Object to Same Object as Parent

我有三個對象, ParentChildNewObject 由於我棄用Parent中的字段時的一些中介工作, ChildParent基本相同。 目前, Parent映射到NewObject就好了,但我還需要 map ParentNewObjectChild對象的內部列表,因此映射返回NewObject的列表。 下面是一個例子

public class Parent {
    public string Code { get; set; }
    public string Name { get; set; }
    public List<Child> Children { get; set; }
}

public class Child {
    public string Code { get; set; }
    public string Name { get; set; }
}

public class New {
    public string NewCode { get; set; }
    public string NewName { get; set; }
}

所以如果我有以下Parent object:

{
    "code": "abcd",
    "name": "parent",
    "children": [
        {
            "code": "efg",
            "name": "child1"
        },
        {
            "code": "xyz",
            "name": "child2"
        }
    ]
}

當我 map 它到NewObject時,結果應該是

[
    {
        "newCode": "abcd",
        "newName": "parent"
    },
    {
        "newCode": "efg",
        "newName": "child1"
    },
    {
        "newCode": "xyz",
        "newName": "child2"
    }
]

有沒有辦法只使用 Automapper 來做到這一點? 還是我需要使用額外的方法?

沒有直接的方法可以做到這一點,沒有AutoMapper你可以嘗試這樣的事情。

public static List<Child> ToNew(Parent parent)    {
    List<Child> result = parent.Children.ToList();
    result.Insert(0, new Child{
        Name = parent.Name, Code = parent.Code
    });
    return result;
}

這將為您提供Child對象List ,然后您可以 map 將其添加到New對象List

CreateMap<List<Child>, List<New>>();

或者您可以按如下方式使用AutoMapper 首先將以下映射添加到您的映射配置文件。

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Parent, List<New>>()
            .AfterMap((src, dest, context) => context.Mapper.Map(src.Children, dest));
        CreateMap<Child, New>()
            .ForMember(dest => dest.NewName, opt => opt.MapFrom(src => src.Name))
            .ForMember(dest => dest.NewCode, opt => opt.MapFrom(src => src.Code));
        CreateMap<Parent, New>()
            .ForMember(dest => dest.NewName, opt => opt.MapFrom(src => src.Name))
            .ForMember(dest => dest.NewCode, opt => opt.MapFrom(src => src.Code));
    }
}

然后使用配置文件創建映射器。

// Manually create the mapper using the Profile
var mapper = new MapperConfiguration(cfg => cfg.AddProfile(new MappingProfile())).CreateMapper();

現在您可以使用以下方法將Parent轉換為List<New>

var myFlattened = mapper.Map<Parent, List<New>>(parent);

Map 父屬性也為New並將其插入到第一個列表中。

var myFlattenedParent = mapper.Map<Parent, New>(parent);
myFlattened.Insert(0, myFlattenedParent);

完整代碼可在此處獲得。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM