gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:26:59 24 4
gpt4 key购买 nike

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

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 查询不支持此转换。

最佳答案

您可以使用 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);
}
}

关于c# - 如何使用 Automapper 映射两个不同的数据类型字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55611198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com