c# - 如何使用自动映射器将源类型的父级映射到目标类型的集合中?

标签 c# automapper

我有这些类(class):

public class Source 
{
    public string ID { get; set; }
    public int Age Name { get; set; }
    public virtual ICollection<SourceChild> SourceChildren { get; set; }
}

public class SourceChild 
{
    public string Name { get; set; }
    public string Language { get; set; }
    public string SourceId { get; set; }
    public virtual Source Source { get; set; }
}

public class Destination
{
    public int Age { get; set; }
    public string Name { get; set; }
    public string Language { get; set; }
    public string Id { get; set; }
}

我使用这些映射来映射这些类:

        Mapper.CreateMap<SourceChild, Destination>()
            .ForMember(item => item.ID, property => property.MapFrom(item => item.SourceId))
            .ForMember(item => item.Age, property => property.MapFrom(item => item.Source.Age));

Automapper 自动映射其他两个属性。因此,如果我尝试将 SourceChild 映射到 Destination 类型,一切正常。但是现在我有另一个使用源和目标类型的类:

public class SourceUser 
{
    public string ID { get; set; }
    public virtual Source Source { get; set; }
}

public class DestinationUser
{
    public string Id { get; set; }
    public List<Destination> Destinations { get; set; } 
}

为了更好地说明情况,这里是对类的简短描述:我有 Source 对象和 SourceChild 子对象。 SourceChild 对象包含不同语言的信息。当我将 Source 映射到 Destination 时,我想输入 Source 对象并接收目标对象集合的输出。对于每个 SourceChild 对象,Source 对象,应该有一个 Destination 对象。SourceUser 只是指 Source 具有一对多关系。 DestinationUserDestination 类有很多关系。换句话说,每个 DestinationUser 都有一个包含所有语言的所有 Destinations 的列表。考虑到所有这些,让我们回到代码。

我在编写我需要的代码时运气不错。我想出了这个:

 Mapper.CreateMap<SourceUser, DestinationUser>()
                .AfterMap((source, destination) => Mapper.Map<Source, List<Destination>>(source.Source));

    Mapper.CreateMap<Source, List<Destination>>()
                    .AfterMap((source, destination) => Mapper.Map<List<SourceChild>, List<Destination>>(source.SourceChildren.ToList(), destination));

这几乎可以正常工作,但有一个 IF。我正在使用可查询扩展来处理映射。当我检索 DestinationUsers 的集合时,它们都没有映射属性 Destinations。它显示为空。但是,如果我像这样手动进行映射:

SourceUser SourceUser = Db.GetSourceUser();
DestinationUser DestUser = Db.GetDestinationUser();
DestUser.Destinations = Mapper.Map<List<Destination>>(SourceUser.Source);

一切正常。 DestinationUsers 的列表是从 Source 的实例映射而来的。

是否可以避免手动调用后面的 Mapper.Map() 调用?另请记住,List Destinations 可能会更改为任何其他集合。我只想为每个 SourceChild 对象 Source 拥有一个 Destination 对象。

最佳答案

事实证明,我距离我所追求的解决方案只有一小步之遥。我所需要的只是扩展我的 SourceUserDestinationUser 类的映射,使其看起来像这样:

Mapper.CreateMap<SourceUser, DestinationUser>()
                .AfterMap((source, destination) => Mapper.Map<Source, List<Destination>>(source.Source, destination.Destinations));

希望这对遇到与我遇到的问题类似的人有帮助:)

关于c# - 如何使用自动映射器将源类型的父级映射到目标类型的集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20000229/

相关文章:

c# - 在 ubuntu 下的 Mono 3.28 中使用通用队列

c# - 在 LINQ To ActiveDirecory 中检测到 DisconnectedContext

architecture - 在 DDD + 分层架构中实现 Automapper 的位置

c# - 忽略使用 Automapper 映射一个属性

automapper - 如何构建 AutoMapper 映射以在目标类构造函数中传递参数

c# - 一段时间后在 RabbitMQ 中获取 OutOfMemory

c# - 如何在c#中的datagridview中的两行之间添加行

C# 正则表达式删除 C 风格注释并提取括号之间的文本

C# 使用反射创建 AutoMapper 映射

c# - 如果在 AutoMapper ForMember 中还有