在我正在处理的应用程序中,数据被获取并以数据集形式返回。但是,我想基于应用程序模型,因此我需要将数据集映射到我的自定义模型类。我遇到了将数据表转换为自定义模型类的 this 方法。
由于我无法控制返回数据集的数据源,因此我无法重命名其列名。仍然在模型类中,我想使用具有我自己的约定名称的属性。
案例是:说我有一个模特
class PersonModel
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
,源数据表包含名为Identificator
,First_Name
,Last_Name
的列。有没有办法以某种方式绑定相应的标签并将数据表的内容映射到PersonModel
的集合?
答案 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.0
和AutoMapper.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
来使它起作用