C# 使用子集合项自动映射展开

C# 使用子集合项自动映射展开,c#,.net,asp.net-core,asp.net-web-api,automapper,C#,.net,Asp.net Core,Asp.net Web Api,Automapper,我正在使用Automapper进行以下源到目标的映射。源对象中有一个子集合,我想使用该项的第一项进行映射 下面是源和目标类: class Source { public string Name { get; set; } public List<InnerSource> InnerSources { get; set; } } class InnerSource { public string InnerName { get; set; } publ

我正在使用Automapper进行以下源到目标的映射。源对象中有一个子集合,我想使用该项的第一项进行映射

下面是源和目标类:

class Source
{
    public string Name { get; set; }
    public List<InnerSource> InnerSources { get; set; }

}
class InnerSource
{
    public string InnerName { get; set; }
    public string InnerDesciption { get; set; }
}

class Destination
{
    public string Name { get; set; }
    public string InnerName { get; set; }
    public string InnerDesciption { get; set; }
}
cfg.CreateMap<Source, Destination>().IncludeMembers(s => s.InnerSources);
cfg.CreateMap<List<InnerSource>, Destination>()
       .ForMember(d => d.InnerName, o => o.MapFrom(s => s.FirstOrDefault().InnerName))
       .ForMember(d => d.InnerDesciption, o => o.MapFrom(s => s.FirstOrDefault().InnerDesciption));
类源代码
{
公共字符串名称{get;set;}
公共列表内部源{get;set;}
}
类内部源
{
公共字符串InnerName{get;set;}
公共字符串内部描述{get;set;}
}
班级目的地
{
公共字符串名称{get;set;}
公共字符串InnerName{get;set;}
公共字符串内部描述{get;set;}
}
映射器配置:

class Source
{
    public string Name { get; set; }
    public List<InnerSource> InnerSources { get; set; }

}
class InnerSource
{
    public string InnerName { get; set; }
    public string InnerDesciption { get; set; }
}

class Destination
{
    public string Name { get; set; }
    public string InnerName { get; set; }
    public string InnerDesciption { get; set; }
}
cfg.CreateMap<Source, Destination>().IncludeMembers(s => s.InnerSources);
cfg.CreateMap<List<InnerSource>, Destination>()
       .ForMember(d => d.InnerName, o => o.MapFrom(s => s.FirstOrDefault().InnerName))
       .ForMember(d => d.InnerDesciption, o => o.MapFrom(s => s.FirstOrDefault().InnerDesciption));
cfg.CreateMap().IncludeMembers(s=>s.InnerSources);
cfg.CreateMap()
.ForMember(d=>d.InnerName,o=>o.MapFrom(s=>s.FirstOrDefault().InnerName))
.ForMember(d=>d.innerdescription,o=>o.MapFrom(s=>s.FirstOrDefault().innerdescription));
当我尝试使用上面的配置进行映射时,它工作得非常好

var source = new Source { 
            Name = "name", 
            InnerSources = new List<InnerSource> { 
                new InnerSource { InnerName = "John", InnerDesciption = "person"}
            }
        };
        var destination = Mapper.Map<Destination>(source);
var source=新源{
Name=“Name”,
InnerSources=新列表{
新的InnerSource{InnerName=“John”,innerDescription=“person”}
}
};
var destination=Mapper.Map(源);
但缺点是,我必须单独映射源子集合中的所有属性


有没有更好的方法来解决上述问题?

您可以在源代码上添加属性(对于
FirstOrDefault
)并使用
IncludeMembers
。您可以在源代码上添加属性(对于
FirstOrDefault
)并使用
IncludeMembers