阻止AutoMapper ProjectTo添加不需要的列

时间:2016-12-09 18:39:33

标签: c# sql entity-framework automapper entity-framework-core

在我看来,使用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&amp;我认为不需要CAST 未命名的列。 这是我的问题的要点

这是要查询POCO实体的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

编辑我在此之前提出了一个简化的解决方案,以确认问题。之后我还尝试通过使Existing成为一个浮点数来改变外部目的地类,或者删除它,但没有运气。

1 个答案:

答案 0 :(得分:1)

此问题与Automapper Projection with Linq OrderBy child property error类似,解决方案也是如此 - 将int main() { Group g; g.insert(new Node); // Valid. g.insert(new Group); // Valid. Group is just a Node in a fancy suit, right? } 配置为不AutoMapper检查null属性:

Main