【问题标题】:How to map Complex type using automapper如何使用自动映射器映射复杂类型
【发布时间】:2022-01-12 16:24:02
【问题描述】:

具有复杂嵌套映射的 Automapper。我正在尝试映射 mydestinationArrayField 和 dest1Array,这里要复制到dest1array的源objectlist。

这是我的源类和目标类。

namespace AutomapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                SourceObject request = new SourceObject()
                {
                    sourceTypeField = "1",
                    SourceObj1Field = new SourceObj1
                    {
                        SourceObj1Id = "1",
                        SourceObjListss = new List<SourceInnerObjList>
                       {

                       new SourceInnerObjList
                       {
                          SourceObjListItem1Id = 1


                       },
                       new SourceInnerObjList
                       {
                           SourceObjListItem1Id = 2

                       }
                   }

                    }
                };
                var mapper = CreateMapper();
                DestinationObject destination = new DestinationObject();
                destination = mapper.Map<DestinationObject>(request);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public static IMapper CreateMapper()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.AllowNullDestinationValues = true;
                cfg.CreateMap<SourceObject, DestinationObject>()
               .ForMember(dest => dest.destinationTypeField, o => o.MapFrom(src => src.sourceTypeField))
               .ForMember(dest => dest.destinationObjectArrayField, o => o.MapFrom(src => new destinationObjectArray()
               {
                   mydestinationArrayField = src.SourceObj1Field.SourceObjListss.Select(x => x.SourceObjListItem1Id).FirstOrDefault().ToString(), //this gives error

                   //dest1Array = src.SourceObj1Field.SourceObjListss // here source objectlist to be copied to dest1array

               }));
            });

            return config.CreateMapper();
        }

    }
}


namespace Automapper
{
    public class SourceObject
    {
        public string sourceTypeField;
        public SourceObj1 SourceObj1Field { get; set; }
    }
    public class SourceObj1
    {
        public string SourceObj1Id { get; set; }

        public ICollection<SourceInnerObjList> SourceObjListss { get; set; }
    }

    public class SourceInnerObjList
    {
        public int SourceObjListItem1Id { get; set; }
        public int SourceObjListItem2d { get; set; }

    }
    public class SourceInnerObj2List
    {
        public int? mycount { get; set; }
        public int? yourcount { get; set; }
    }

}


namespace Automapper
{
    public class DestinationObject
    {
        public string destinationTypeField;
        public destinationObjectArray[] destinationObjectArrayField;
    }

    public class destinationObjectArray
    {
        public string mydestinationArrayField;

        public string myField1;

        public destinationInnerObject1Array[] dest1Array;

        public destinationInnerObject2Array[] dest2Array;
    }
    public class destinationInnerObject1Array
    {
        public string destinationInnerObjectItem11;
        public string destinationInnerObjectItem21;
    }
    public class destinationInnerObject2Array
    {
        public string categoryTypeField;

        public string valueField;

        public string NumberField;
    }
}

在执行映射时,我收到“缺少类型映射配置或不支持的映射”。

无论我如何配置忽略或自定义映射,它似乎都不喜欢这种嵌套。任何 Automapper 专家都可以告诉我如何使用这样的复杂对象进行映射。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core automapper


    【解决方案1】:

    您的第二个 ForMember 似乎不起作用:

    .ForMember(dest => dest.destinationObjectArrayField, o => o.MapFrom(src => new destinationObjectArray() //...
    

    因为在您将地图定义为返回destinationObjectArray() 而不是destinationObjectArray[]!

    所以有一个像这样的地图:

    destinationObjectArrayField->destinationObjectArray()

    没有像这样的地图:

    destinationObjectArrayField->destinationObjectArray[]

    Automapper 会告诉你这一点。

    你应该这样做:

        cfg.CreateMap<SourceObject, DestinationObject>()
                    .ForMember(dest => dest.destinationTypeField, o => o.MapFrom(src => src.sourceTypeField))
                    .ForMember(dest => dest.destinationObjectArrayField,
                        o => o.MapFrom(
                            src => src.SourceObj1Field
                                .SourceObjListss
                                .Select(x => new destinationObjectArray
                                {
                                    myField1 = $"first_id: {x.SourceObjListItem2d} second_id: {x.SourceObjListItem1Id}"
                                })
                                .ToArray()
                        ));
        });
    

    还强烈建议您清理和格式化代码,您似乎只是迷失在其中! IDE 可以提供帮助。

    【讨论】:

    • 这个映射有效,但是我得到了多个destinationObjectArrayField,我需要destinationObjectArrayField [0] 和destinationInnerObject1Array 将是一个列表.destinationObjectArrayField [0].destinationInnerObject1Array
    • 你能建议我如何将其更改为“destinationObjectArrayField 只需要一个值,比如第一个或默认值(这意味着数组将只有一个项目,而内部对象 destinationInnerObject1Array 将具有列表中的所有属性) 和 destinationInnerObject1Array[] 将包含 SourceObjListss 中的所有项目。即我的示例中的行 //dest1Array = src.SourceObj1Field.SourceObjListss
    • CI 已添加 firstordefault 以仅获取一项,但它为成员提供自定义配置仅支持类型上的顶级个人成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多