如何使用Automapper映射两个不同的数据类型字段?

问题描述 投票:3回答:1

我试图使用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个回答
1
投票

您可以使用AutoMapper的Custom Type Converters

例如,AutoMapper不知道从字符串到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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.