使用Automapper将Linq设置为null值

5

我有一个包含消息的工单。此外,工单模型还包含一个可为null的解决方案消息。

我想要做这样的事情:

Mapper.CreateMap<Ticket, TicketModel>()
.ForMember(dest => dest.ResolutionMessage, opt => opt.MapFrom(src => 
            {

                if (src.ResolutionMessageID != null)
                {
                    src.Messages.Where(m => m.MessageID == src.ResolutionMessageID);
                }
                else
                    // Return null;
                }
                ));

第二次尝试:

            .ForMember(dest => dest.ResolutionMessage, opt =>
                {
                     (opt.MapFrom(src => if(src.ResolutionMessageID != null) 
                      opt.MapFrom(src => src.Messages.Where(m => m.MessageID == src.ResolutionMessageID));
                else
                    opt => opt.Ignore();
                }

                );

有什么想法吗?

2个回答

2

我认为 ResolutionMessageID 是可空类型,您可以尝试如下操作:

.ForMember(dest => dest.ResolutionMessage, opt => opt.MapFrom(src => src.ResolutionMessageID.HasValue ? src.Messages.Where(m => m.MessageID == src.ResolutionMessageID) : null));

如果它不是可空类型并且允许为空:

.ForMember(dest => dest.ResolutionMessage, opt => opt.MapFrom(src => src.ResolutionMessageID != null ? src.Messages.Where(m => m.MessageID == src.ResolutionMessageID.Value) : null));

你可以使用 opt.MapFrom()opt.Ignore(),但不能同时使用。当映射条件不符合规则时,最好保留 null 值。如果使用 opt.Ignore(),则在对象转换中会忽略该属性。


ResolutionMessageID是可空类型。看起来这正是我需要的,但不幸的是我仍然需要执行opt => opt.Ignore();,因为自动映射器似乎不喜欢空值... 有没有办法使用opt.ignore()来解决这个问题? - billybob

1
尝试在AutoMapper中使用AfterMap MappingExpression,然后检查null值。
  • AfterMap(Action<TSource, TDestination> afterFunction);

示例:

 // Execute a custom function to the source and/or destination types after member mapping

CreateMap<Resource, SubjectResource>()
.AfterMap((src, dest) =>
              {
                if (src.Subject.English == null)
                {
                  dest.Subject.English = Enumerable.Empty<SubjectResourceList>();
                }
              });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接