在我看来,使用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
成为一个浮点数来改变外部目的地类,或者删除它,但没有运气。
答案 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