【问题标题】:Automapper to map an interface based on the Ternary OperatorAutomapper 基于三元运算符映射接口
【发布时间】:2020-11-19 10:59:30
【问题描述】:

我正在使用 AutoMapper 7.0.1 版本。我有一个 DTO 类:

public class Dto1{
    public IModel Model {get;set;}
}

public interface IModel {}

public class QuestionA: IModel {
    public string Text {get; set;}
}

public class QuestionB: IModel {
    public string Id {get;set;}
}

在创建 Linq to Entity 期间,我遇到了一个条件,我必须根据条件创建 QuestionA 类或 ClassB 的对象。我的映射是这样的:

CreatMap<SourceClass, Dto1>()  
      .ForMember(d=> d.Model, opt=> opt.MapFrom(src => src.Type == 0 ? 
                 new QuestionA()
                 {  
                     Text = src.Text
                 } : new QuestionB()
                 {
                     Id = src.Id
                 }));

我无法实现这种行为。我得到运行时异常:

无法将类型“QuestionA”转换为类型“IQuestionTypeModel”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

【问题讨论】:

  • 您是否尝试在 MapFrom 表达式中强制转换为 IModel?喜欢(IModel) new QuestionA()
  • 是的!但它没有用
  • 请用代码更新问题,显示您如何使用 AutoMapper 以及您正在执行的查询。我尝试使用 AutoMapper Queryable Extensions ProjectTo() 使用 EF Core 和本地 SQL 服务器,但我未能重现您遇到的错误。它奏效了。

标签: c# entity-framework mapping linq-to-entities automapper


【解决方案1】:

三元运算符的两端必须返回相同的类型。尽管QuestionAQuestionB 都实现了IModel,但您需要明确地将它们标记为同一类型:

CreateMap<SourceClass, Dto1>()
    .ForMember(
        d => d.Model,
        opt => opt.MapFrom(src =>
            src.Type == 0
            ? new QuestionA() { Text = src.Text } as IModel
            : new QuestionB() { Id = src.Id } as IModel));

编辑 #1

我在本地尝试使用 SQL Server,使用上述配置和 AutoMapper Querable Extensions ProjectTo()

var result = dbContext
    .Set<SourceClass>()
    .ProjectTo<Dto1>(configuration)
    .ToList();

我收到了有效的结果。 EF Core 生成了这样的查询:

SELECT CASE
    WHEN [s].[Type] = 0 THEN CAST(1 AS bit)
    ELSE CAST(0 AS bit)
END, [s].[Text], [s].[Id]
FROM [SourceClass] AS [s]

【讨论】:

  • 不!它也不起作用,因为 Linq to entity throwing error 不支持带有“QuestionA”类型输入和“IModel”类型检查的“TypeAs”表达式。 LINQ to Entities 查询仅支持实体类型和复杂类型。
猜你喜欢
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2019-11-05
相关资源
最近更新 更多