繁体   English   中英

Automapper 复杂映射从 List 到 Object

[英]Automapper Complex mapping from List to Object

我有 object 结构如下

public class Source
{
    public Connection Connection { get; set;}
}

public class Connection
{
    public string Id { get; set;
    public IEnumerable<Distributor> Distributors { get; set;
}

public class Distributor { get; set; }
{
    public DistributorType Type {get; set;}
    public  string X { get; set; }
    public string Y { get; set; }
}

public class Destination
{
     public Distribution Distribution { get; set;
}

public class Distribution
{
    public string Id { get; set;}
    public  string X { get; set; }
    public string Y { get; set; }
}

我想将 map 的 Source to Destination 用于属性分布。 映射如下

Source.Connection.Distributors.FirstOrDefault().X => Destination.Distribution.X
Source.Connection.Distributors.FirstOrDefault().Y => Destination.Distribution.Y
Source.Connection.Id => Destination.Distribution.Id 

我曾尝试使用自定义解析器,但没有运气

public class CustomDistributorResolver : IValueResolver<Source, Destination, Distribution >
    {
        public Distribution  Resolve(Source source, Destination destination, Distribution destMember, ResolutionContext context)
        {
            var result = source.Connection.Distributors.FirstOrDefault(x => x.DistributorType =="ABC");
            if (result == null) return null;

            return new Distribution 
            {
                Id                      = source.Connection?.Id,
                X                       = result.X,
                Y                       = result.Y
            };
        }
    }

映射文件

CreateMap<Source, Destination>()
                .ForMember(d => d.Distribution, opt => opt.MapFrom( new CustomDistributorResolver()));

我总是得到 NULL 的分布值。

我不确定我在地图上做错了什么。

-艾伦-

我不太确定您将如何处理 IEnumerable。 所以我使用 linq 来接近。

var id = Source.Connection.Id;
var distributions = Source.Connection.Distributors.Select(m=> new Distribution()
                    {
                            Id = id,
                            X = m.X,
                            Y = m.Y,
                    });

Automapper 想要:

CreateMap<Source, Destination>()
    .ForMember(dest => dest.Distribution.Id ,opt => opt.MapFrom(src => src.Connection.Id))
    .ForMember(dest => dest.Distribution.X,  opt => opt.MapFrom(src => src.Connection.Distributors.FirstOrDefault().X))
    .ForMember(dest => dest.Distribution.Y,  opt => opt.MapFrom(src => src.Connection.Distributors.FirstOrDefault().Y));

您可以使用类型转换器

private class DestinationConverter : ITypeConverter<Source, Destination>
{
    public Destination Convert(Source source,
    Destination destination,

    ResolutionContext context)
    {
        var result = source.Connection.Distributors.FirstOrDefault(x => x.Type == "ABC");

        if (result == null) return null;
        destination = new Destination();

        destination.Distribution = new Distribution
        {
            Id = source.Connection?.Id,
            X = result.X,
            Y = result.Y
        };

        return destination;
    }
}

并注册转换器

CreateMap<Source, Destination>().ConvertUsing<DestinationConverter>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM