【问题标题】:How to map two different datatype fields using Automapper?如何使用 Automapper 映射两个不同的数据类型字段?
【发布时间】:2019-04-10 11:15:09
【问题描述】:

我正在尝试使用 Automapper 通过 ProjectTo IQueryable 将对象的字段与源的子集合映射如下:

var map2 = cfg.CreateMap<SourceModel, DestinationModel>(); 

map2.ForMember(fieldName, opt => opt.MapFrom(source => source.CustomFieldValues.FirstOrDefault(f => f.Name == fieldName).Value));

型号如下:

public class SourceModel
{
  public IEnumerable<CustomFieldValue> CustomFieldValues { get; set; }
}

public class CustomFieldValue
{

    public string Name { get; set; }
    public string Value { get; set; }
}

public class DestinationModel
{
    public string _CUSTOM_Test { get; set; }
    public int _CUSTOM_Mynumber { get; set; }
    public DateTime _CUSTOM_mydate { get; set; }
    public bool _CUSTOM_mybool { get; set; }
    public decimal _CUSTOM_numberdec { get; set; }
    public int _CUSTOM_numint { get; set; }
    public int _CUSTOM_numper { get; set; }
    public DateTime _CUSTOM_mydate2 { get; set; }
    public DateTime _CUSTOM_mydate3 { get; set; }
    public DateTime _CUSTOM_mydate4 { get; set; }
    public int _CUSTOM_mynum2 { get; set; }
}

预期结果: 由于该集合仅包含字符串值,但我需要根据字段名称映射到不同的数据类型。

实际结果: 但是当我尝试应用转换时,查询会抛出异常,因为 sql 查询不支持这种转换。

【问题讨论】:

  • 目标模型是什么样的?
  • 对不起,我错误地为源和目标写了相同的名称。我刚刚更新了描述。真的很感谢你!

标签: c# types expression automapper


【解决方案1】:

您可以使用 AutoMapper 的Custom Type Converters

AutoMapper 不知道从 string 到 int 的任何映射,因此要为这些类型创建映射,我们必须提供自定义类型转换器。这可以通过使用ConvertUsing() 方法来实现。

Mapper.Initialize(configuration =>
{
    configuration.CreateMap<string, int>().ConvertUsing(s => Convert.ToInt32(s));
    configuration.CreateMap<string, DateTime>().ConvertUsing(s => new DateTimeTypeConverter().Convert(s));
    configuration.CreateMap<string, bool>().ConvertUsing(s => Convert.ToBoolean(s));
    configuration.CreateMap<string, decimal>().ConvertUsing(s => Convert.ToDecimal(s));
    configuration.CreateMap<SourceModel, DestinationModel>()
        .ForMember("_CUSTOM_Mynumber", opt => opt.MapFrom(src => src.CustomFieldValues.FirstOrDefault(x => x.Name == "_CUSTOM_Mynumber").Value));
});

上面的例子展示了我们如何转换intbooldecimal。对于DateTime,我们将使用ITypeConverter

public interface ITypeConverter<in TSource, TDestination>
{
    TDestination Convert(TSource source);
}

然后定义一个自定义转换:

public class DateTimeTypeConverter : ITypeConverter<string, DateTime>
{
    public DateTime Convert(source)
    {
        return Convert.ToDateTime(source);
    }
}

【讨论】:

  • 我试过了,但它无法为 Queryable 创建有效的 sql,因为它会引发 Convert.ToBoolean 不是有效的表达式调用和所有其他数据类型相同的异常,如下所示:“'LINQ to Entities 确实无法识别方法 'Boolean ToBoolean(System.String)' 方法,并且此方法无法转换为存储表达式。这仅适用于 ToList 或 Enumerable 类型
猜你喜欢
  • 1970-01-01
  • 2014-09-23
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多