【问题标题】:Automapper Complex mapping from List to ObjectAutomapper 从列表到对象的复杂映射
【发布时间】:2020-05-25 05:20:39
【问题描述】:

我的对象结构如下

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; }
}

我想将 Source 映射到 Destination 以用于属性 Distribution。映射如下

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()));

我总是将 Distribution 值设为 NULL。

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

-艾伦-

【问题讨论】:

  • 我现在不在我的 Windows PC 附近,但我有类似的东西,我认为这归因于 EF 核心中的延迟加载设置。这可能值得检查。
  • ForMember(d =&gt; d.Distribution, o =&gt; o.MapFrom(s =&gt; s.Connection.Distributors.FirstOrDefault(x =&gt; x.DistributorType =="ABC"))

标签: c# .net automapper


【解决方案1】:

我不太确定您将如何处理 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));

【讨论】:

    【解决方案2】:

    你可以使用类型转换器

    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>();
    

    【讨论】:

    • 我知道这是手动映射,但由于 FirstOrDefault 研究,我认为这是此案例唯一可能的解决方案。作者提到了CustomDistributorResolver,所以我尝试了另一种映射的可能解决方案。
    • 不,不是。正如我在上面所评论的,您可以将该查询放在MapFrom 中。并且可能通过Id 中的context.Items。
    • 对不起,再来一次-:)。 Distribution 中的属性 Id 是 source.Connection?.Id。没有映射您的解决方案 ID,因为在 Distributor 中不存在。结果有来自一个类(Distributor)的 X 和 Y 以及来自另一个(Connection)的 ID。
    • 我已经介绍过了。另一种选择是从source.Connection 映射。
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多