Мне кажется, что использование AutoMapper ProjectTo<>
добавляет нежелательный (рассчитанный) столбец к моему запросу. Вот запрос:Предотвращение AutoMapper ProjectTo от добавления нежелательного столбца
SELECT TOP(1) CASE
WHEN [dto].[Id] IS NULL
THEN CAST(0 AS BIT) ELSE CAST(1 AS BIT)
END, [dto].[Enabled], [dto].[DurationWarningThresholdSec], [dto].[AverageDurationLabel]
где что первый СЛУЧАЙ & CAST неназванный столбец на самом деле не нужно, я думаю. Это суть моей проблемы.
Это EF Ядро (возможно, что вопросы) ПОКО объект выполняется запрос:
public class CountersConfigData
{
public Guid Id { get; set; }
public bool Enabled { get; set; }
public int DurationWarningThresholdSec { get; set; }
public string AverageDurationLabel { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? ModifiedAt { get; set; }
public DateTime? DeletedAt { get; set; }
public Guid CompanyId { get; set; }
}
// within DbContext.OnModelCreating()
entityTypeBuilder.HasKey(cfg => cfg.Id);
entityTypeBuilder.HasIndex(cfg => cfg.DeletedAt);
Вот форма назначения отображения:
public class Result
{
public bool Existing { get; set; }
public CountersMainConfig Main { get; set; }
}
public class CountersMainConfig
{
public bool Enabled { get; set; }
public int DurationWarningThresholdSec { get; set; }
public string AverageDurationLabel { get; set; }
}
Это отображение начальной настройки:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<CountersConfigData, Result>()
.ForMember(dest => dest.Main, opt => opt.MapFrom(src => src))
.ForMember(dest => dest.Existing, opt => opt.Ignore());
cfg.CreateMap<CountersConfigData, CountersMainConfig>();
});
Я понимаю, что могу проектировать внутренний тип, CountersMainConfig
, а затем вручную создать экземпляр внешнего типа. Но у меня есть другие случаи, похожие на этот, с более сложными внешними типами, поэтому я бы хотел разобраться в них для всех.
Если я на самом деле проектирую внутренний тип, этот первый столбец уходит от сгенерированного запроса. Что мне не хватает? TA
EDIT Я создал упрощенное решение, чтобы подтвердить этот вопрос, прежде чем спрашивать здесь. Впоследствии я также попытался изменить внешний класс назначения, сделав Existing
поплавком или удалив его, не повезло.
Попробуйте установить постоянное значение вместо 'Ignore':' .ForMember (dest => dest.Existing, opt => opt.UseValue (false)); '. Не очень чистый. «Игнорировать» должен работать. Возможно, если вы установите значение boolean как nullable, будет применено 'Ignore'? Возможно, ваше сопоставление переопределяется после первоначального определения и потеряет «Ignore»? –
Diana
Спасибо, что ответили. Но тот же SQL генерируется даже после полного удаления свойства «Существующий», поэтому почему-то это приводит меня к тому, что такое свойство не имеет большого значения. Кажется, что это связано с вложенной структурой адресата. Я попробую. – superjos
Просто чтобы подтвердить, что логическое свойство не было проблемой. @ Иван Стоев ответил трюк – superjos