【问题标题】:AutoMapper: how to map object collection to Pair<int, string> collectionAutoMapper:如何将对象集合映射到 Pair<int, string> 集合
【发布时间】:2019-05-25 13:37:29
【问题描述】:

源类:

public partial class Carrier 
{
    public virtual ICollection<Driver> Drivers { get => _drivers ?? (_drivers = new List<Driver>()); protected set => _drivers = value; }

Driver 在哪里:

public partial class Driver 
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

目的地类:

public class CarrierDto
{
    public List<Pair<int, string>> Drivers { get; set; }

我手动完成:

            new CarrierDto
            {
                //...
                Drivers = p.Drivers.Select(d => new Pair<int, string> { Text = d.FirstName + " " + d.LastName, Value = d.Id }).ToList(),

如何使用 Automapper 映射Drivers 属性?

public class AutoMapperEfCarrier : AutoMapper.Profile
{
    public AutoMapperEfCarrier()
    {
        CreateMap<Carrier, CarrierDto>()
            .ForMember(dest => dest.Drivers, opt => ?????)
            ;
    }

【问题讨论】:

    标签: c# collections automapper


    【解决方案1】:

    您只需要创建一个从DriverPair&lt;int, string&gt; 的映射:

    public class AutoMapperEfCarrier : AutoMapper.Profile
    {
        public AutoMapperEfCarrier()
        {
            CreateMap<Carrier, CarrierDto>(); // no need to specify Drivers mapping because the property name is the same
    
            // those below are just examples, use the correct mapping for your class
    
            // example 1: property mapping
            CreateMap<Driver, Pair<int, string>>()
                .ForMember(p => p.Value, c => c.MapFrom(s => s.Id))
                .ForMember(p => p.Text, c => c.MapFrom(s => s.FirstName + " " + s.LastName));
    
            // example 2: constructor mapping
            CreateMap<Driver, Pair<int, string>>()
                .ConstructUsing(d=> new Pair<int, string>(d.Id, d.LastName));
        }
    }
    

    【讨论】:

    • 我做不到,因为我有很多List&lt;Pair&lt;int, string&gt;&gt;类型的属性
    • 我不明白。什么是你不能做的?这只是将Driver 映射到Pair,它不会更改任何其他属性。
    • 是的,你是对的,它只影响驱动类型。但是不行,返回默认值` { "value": 0, "text": null }` :)
    • 我确信代码可以正常工作,我自己测试过。此外,根据 AutoMapper 文档,这是进行这些类型映射的首选方式。恐怕您的问题中没有显示其他内容。
    【解决方案2】:

    我顺便实现了:

                .ForMember(dest => dest.Drivers, opt => opt.MapFrom(src => src.Drivers.Select( d=> new Pair<int, string>() { Value = d.Id, Text = $"{d.FirstName} {d.LastName}" }).ToList()))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2023-04-04
      • 2015-03-18
      相关资源
      最近更新 更多