Я хотел бы вручную присвоить значение свойству DTO в профиле AutoMapper в зависимости от значения, которое у меня есть в моей сущности.
Ниже вы можете увидеть мой код, но он работает не так, как ожидалось, потому что .AfterMap
не зависит от .Condition
, на самом деле каждый dest.Sent
сопоставляется с true
:
.ForMember(
dest => dest.Sent,
opts => opts.Condition(src => src.Status == 2 && src.Status != 1)
)
.AfterMap((notification, dto) =>
dto.Sent = true);
Мой DTO
public class NotificationItemDTO
{
public long Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Type { get; set; }
public bool Sent { get; set; }
}
Мой источник
public class Notification
{
public long Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Type { get; set; }
public int Status { get; set; }
}
Я хочу присвоить значение dest.Sent
, которое является логическим, в зависимости от src.Status
, которое является int
. Итак, если src.Status == 1
, то мой dest.Sent
= false
, если src.Status == 2
, мой dest.Sent
= true
. Можно ли этого добиться?
Вы неправильно поняли использование .Condition().
AutoMapper позволяет вам добавлять условия к свойствам, которые должны быть соблюдены, прежде чем это свойство будет сопоставлено.
Следовательно, в вашем сценарии вы пытаетесь присвоить целевому назначению другое значение в зависимости от условия, но не блокируете сопоставление источника с целевым назначением по условию, которое является основной целью .Condition()
.
Хотя .AfterMap()
является последним действием, которое должно быть выполнено после выполнения логики определения сопоставления, следовательно, значение будет переопределено.
Использование .MapFrom()
и определение логики для установки Sent
назначения является true
только тогда, когда Status
источника равно 2.
CreateMap<Notification, NotificationItemDTO>()
.ForMember(
dest => dest.Sent,
opts => opts.MapFrom(src => src.Status == 2)
);