C# 使用Automapper将多个列表转换为单个主子对象列表

C# 使用Automapper将多个列表转换为单个主子对象列表,c#,automapper,C#,Automapper,我有2个对象需要使用automapper转换为Dto对象。 这两个对象是 public class Parent { public int ParentID { get; set;} public string ParentCode { get; set; } } public class Child { public int ChildID { get; set; } public int

我有2个对象需要使用automapper转换为Dto对象。 这两个对象是

    public class Parent
    {
        public int ParentID { get; set;}
        public string ParentCode { get; set; }
    }

    public class Child
    {
        public int ChildID { get; set; }
        public int ParentID { get; set;}
        public string ChildCode { get; set; }
    }
和2个Dto对象

    public class ParentDto
    {
        public int ParentID { get; set; }
        public string ParentCode { get; set; }
        public List<ChildDTO> ListChild { get; set; }
    }

    public class ChildDto
    {
        public int ChildID { get; set; }
        public string ChildCode { get; set; }
    }
公共类ParentDto
{
public int ParentID{get;set;}
公共字符串父代码{get;set;}
公共列表ListChild{get;set;}
}
公营儿童
{
public int ChildID{get;set;}
公共字符串ChildCode{get;set;}
}
需要转换2套列表

List<Parent> ListParent
List<Child> ListChild
列出ListParent
列表列表子项

列出ListParentDto

因为您有多个源,所以我的解决方案是这样一种方法

    public static List<ParentDto> MapToDto(List<Parent> parents, List<Child> childs)
    {
        List<ParentDto> parentDtos = new List<ParentDto>();
        var config = new MapperConfiguration(cfg => {

            cfg.CreateMap<Parent, ParentDto>().BeforeMap((s, d) =>
            {
                d.ListChild = new List<ChildDto>();
                foreach (var child in childs.Where(c => c.ParentID == s.ParentID))
                {
                    d.ListChild.Add(new ChildDto { ChildCode = child.ChildCode, ChildID = child.ChildID });
                }
            }).ForMember(dest => dest.ParentID, opt => opt.MapFrom(src => src.ParentID)).ForMember(dest => dest.ParentCode, opt => opt.MapFrom(src => src.ParentCode));
        });

        IMapper mapper = config.CreateMapper();

        foreach (var p in parents)
        {
            var source = p;
            var destination = mapper.Map<Parent, ParentDto>(source);
            parentDtos.Add(destination);
        }

        return parentDtos;
    }
公共静态列表映射到(列出父对象,列出子对象)
{
List parentDtos=新列表();
var config=new-MapperConfiguration(cfg=>{
cfg.CreateMap().BeforeMap((s,d)=>
{
d、 ListChild=新列表();
foreach(childs.Where中的var child(c=>c.ParentID==s.ParentID))
{
d、 Add(new ChildDto{ChildCode=child.ChildCode,ChildID=child.ChildID});
}
}).FormMember(dest=>dest.ParentID,opt=>opt.MapFrom(src=>src.ParentID)).FormMember(dest=>dest.ParentCode,opt=>opt.MapFrom(src=>src.ParentCode));
});
IMapper mapper=config.CreateMapper();
foreach(父项中的var p)
{
var源=p;
var destination=mapper.Map(源);
parentDtos.Add(目的地);
}
返回parentDtos;
}

不理解以下代码->foreach(childs.Where中的var child(c=>c.ParentID==s.ParentID))->什么是childs???它可以工作。。但是我有很多父母和孩子的Dto。。。你能帮我一个通用的方法吗?提前谢谢兄弟。太好了:)请帮我把我的答案标记为有用的。你有没有更多的课程是这样的?你想要一个通用的方法来接收两个列表,就像我发布的一样,并返回一个结果?一个解决方案是,做两个接口,iPart和IChild,在该方法中,输入参数将是List和List,您可以使用不同的类,但由于它们都实现了具有基参数的相同接口,因此该方法变得通用。
    public static List<ParentDto> MapToDto(List<Parent> parents, List<Child> childs)
    {
        List<ParentDto> parentDtos = new List<ParentDto>();
        var config = new MapperConfiguration(cfg => {

            cfg.CreateMap<Parent, ParentDto>().BeforeMap((s, d) =>
            {
                d.ListChild = new List<ChildDto>();
                foreach (var child in childs.Where(c => c.ParentID == s.ParentID))
                {
                    d.ListChild.Add(new ChildDto { ChildCode = child.ChildCode, ChildID = child.ChildID });
                }
            }).ForMember(dest => dest.ParentID, opt => opt.MapFrom(src => src.ParentID)).ForMember(dest => dest.ParentCode, opt => opt.MapFrom(src => src.ParentCode));
        });

        IMapper mapper = config.CreateMapper();

        foreach (var p in parents)
        {
            var source = p;
            var destination = mapper.Map<Parent, ParentDto>(source);
            parentDtos.Add(destination);
        }

        return parentDtos;
    }