2016-12-09 29 views
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浮動,或通過刪除它,但沒有運氣來更改外部目標類別。

+0

嘗試設置一個恆定值,而不是使用'Ignore':'.ForMember( dest => dest.Existing,opt => opt.UseValue (false));'。雖然不是很乾淨。 '忽略'應該工作。也許如果你設置布爾屬性爲空,那麼'Ignore'會被應用?也許你的映射在初始定義和'Ignore'gets丟失後被覆蓋了? – Diana

+1

感謝您的回覆。但是,即使在完全拋棄'Existing'屬性之後,也會生成相同的SQL,所以不知怎的,這導致我認爲這樣的屬性應該不重要。它似乎與目的地的嵌套結構有關。我會盡力。 – superjos

+1

只是爲了確認布爾屬性不是問題。 @Ivan Stoev的答案做到了 – superjos

回答