1
在我看來,使用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]
那裏是不是真的需要,首先CASE & CAST未命名列,我想。 這是我的問題的要點。
這是EF 核心(也許這事項)POCO實體被查詢:
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
編輯我創建了一個簡化的解決方案,只是爲了在問這裏之前確認問題。之後,我還嘗試通過使Existing
浮動,或通過刪除它,但沒有運氣來更改外部目標類別。
嘗試設置一個恆定值,而不是使用'Ignore':'.ForMember( dest => dest.Existing,opt => opt.UseValue(false));'。雖然不是很乾淨。 '忽略'應該工作。也許如果你設置布爾屬性爲空,那麼'Ignore'會被應用?也許你的映射在初始定義和'Ignore'gets丟失後被覆蓋了? –
Diana
感謝您的回覆。但是,即使在完全拋棄'Existing'屬性之後,也會生成相同的SQL,所以不知怎的,這導致我認爲這樣的屬性應該不重要。它似乎與目的地的嵌套結構有關。我會盡力。 – superjos
只是爲了確認布爾屬性不是問題。 @Ivan Stoev的答案做到了 – superjos