从DataTable映射到属性名称不同于列名称的自定义模型

时间:2014-01-24 15:09:58

标签: c# model datatable automapper

在我正在处理的应用程序中,数据被获取并以数据集形式返回。但是,我想基于应用程序模型,因此我需要将数据集映射到我的自定义模型类。我遇到了将数据表转换为自定义模型类的 this 方法。

由于我无法控制返回数据集的数据源,因此我无法重命名其列名。仍然在模型类中,我想使用具有我自己的约定名称的属性。

案例是:说我有一个模特

class PersonModel
{
    public int ID { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

,源数据表包含名为IdentificatorFirst_NameLast_Name的列。有没有办法以某种方式绑定相应的标签并将数据表的内容映射到PersonModel的集合?

3 个答案:

答案 0 :(得分:3)

首先,您将按如下方式创建映射:

Mapper.CreateMap<IDataReader, PersonModel>()                
.ForMember(dest => dest.ID, opt => opt.MapFrom(src => src.GetInt32(src.GetOrdinal("Identificator"))))
.ForMember(dest => dest.FirstName , opt => opt.MapFrom(src => src.GetString(src.GetOrdinal("First_Name"))))
.ForMember(dest => dest.LastName , opt => opt.MapFrom(src => src.GetString(src.GetOrdinal("Last_Name"))));

然后在您的代码中,您将创建一个数据读取器并映射它:

// Get the data reader and store in dr variable

var people = Mapper.Map<IDataReader, List<PersonModel>>(dr);

答案 1 :(得分:0)

我会推荐老式的方式。构建一个数据访问类,它将检索数据处理转换并返回自定义对象。

public static List<PersonModel> GetPeople()
{
    List<PersonModel> people = new List<PersonModel>();

    DataSet data = SomeMethodToGetTheDataSet();
    foreach(DataRow in data.Tables[0].Rows)
    {
        PersonModel person = getPersonFromDataRow();
        people.Add(person);
    }
    return people;
}



private static PersonModel getPersonFromDataRow(DataRow row)
{
    PersonModel person = new PersonModel();
    person.ID = row.Field<int>("Identificator");
    person.FirstName = row.Field<string>("First_Name");
    person.LastName = row.Field<string>("Last_Name");
    return person;
}

这只是一个简单的例子。您需要添加错误检查和try / catch块以防止空引用异常。但这应该基本上向你展示它是如何完成的。

答案 2 :(得分:0)

仅供参考 AutoMapper 8.0.0AutoMapper.Data 3.0.0

var config = new MapperConfiguration(cfg =>
{
    cfg.AddDataReaderMapping();

    cfg.CreateMap<IDataRecord, PersonModel>()
    .ForMember(dest => dest.ID, opt => opt.MapFrom(src => src.GetValue(src.GetOrdinal("Identificator"))))
    .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.GetValue(src.GetOrdinal("First_Name"))))
    .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.GetValue(src.GetOrdinal("Last_Name"))));
});
var mapper = config.CreateMapper();

DataTable dt = GetDataTable();
var people = mapper.Map<IDataReader, List<PersonModel>>(dt.CreateDataReader());

不知道为什么,但是必须使用CreateMap<IDataRecord而不是CreateMap<IDataReader来使它起作用

参考: https://github.com/AutoMapper/AutoMapper.Data/issues/35