自动映射器从数据集列映射到对象列表
Automapper map from dataset columns to list of object
我有一个包含 3 个固定列和其他变量的数据集,该数据集是通过存储过程在 C# 中创建的。
我想通过 Automapper 将数据集映射到此对象:
public class PrivacyStatusData
{
public int Id { get; set; }
public string Name{ get; set; }
public string Surname { get; set; }
public List<ConsentData> ConsentList { get; set; }
}
public class ConsentData
{
public string ConsentName { get; set; } // Consent1 Column Name
public bool ConsentValue { get; set; } // Consent1 Value
public DateTime ConsentDate { get; set; } // Consent1Date Value
}
感谢您的帮助。
我自己找到了解决方案。静态属性通过 MapFrom 函数映射,动态属性通过自定义解析器映射。诀窍是映射 DataRow 而不是 DataTable。
CreateMap 定义:
CreateMap<DataRow, PrivacyStatusData>()
.ForMember(dest => dest.Id, orig => orig.MapFrom(row => (int)row["Id"]))
.ForMember(dest => dest.Name, orig => orig.MapFrom(row => row["Name"].ToString()))
.ForMember(dest => dest.Surname, orig => orig.MapFrom(row => row["Surname"].ToString()))
.ForMember(dest => dest.ConsentList, orig => orig.MapFrom<DataRowToConsentDataResolver>());
解析器:
public class DataRowToConsentDataResolver : IValueResolver<DataRow, PrivacyStatusData, List<ConsentData>>
{
public List<ConsentData> Resolve(DataRow source, PrivacyStatusData destination, List<ConsentData> destMember, ResolutionContext context)
{
var consentDataList = new List<ConsentData>();
for (int i = 9; i < source.Table.Columns.Count; i += 2)
{
var consentData = new ConsentData();
var consentName = source.Table.Columns[i].ColumnName.Replace("Consenso", "");
consentName = consentName.First().ToString().ToUpper() + consentName.Substring(1).ToLower();
consentData.ConsentName = consentName;
if (source[i].ToString() == "1")
consentData.ConsentValue = true;
consentData.ConsentDate = "-";
var dtDate = new DateTime();
if (DateTime.TryParse(source[i + 1].ToString(), out dtDate))
consentData.ConsentDate = dtDate.ToString("dd MMMM yyyy");
consentDataList.Add(consentData);
}
return consentDataList;
}
}
来电者:
private List<PrivacyStatusData> MapDataTableToPrivacyStatusData(DataTable privacyData)
{
var rows = new List<DataRow>(privacyData.Rows.OfType<DataRow>());
var privacyStatusDataList = mapper.Map<List<DataRow>, List<PrivacyStatusData>>(rows);
return privacyStatusDataList;
}
我有一个包含 3 个固定列和其他变量的数据集,该数据集是通过存储过程在 C# 中创建的。
我想通过 Automapper 将数据集映射到此对象:
public class PrivacyStatusData
{
public int Id { get; set; }
public string Name{ get; set; }
public string Surname { get; set; }
public List<ConsentData> ConsentList { get; set; }
}
public class ConsentData
{
public string ConsentName { get; set; } // Consent1 Column Name
public bool ConsentValue { get; set; } // Consent1 Value
public DateTime ConsentDate { get; set; } // Consent1Date Value
}
感谢您的帮助。
我自己找到了解决方案。静态属性通过 MapFrom 函数映射,动态属性通过自定义解析器映射。诀窍是映射 DataRow 而不是 DataTable。
CreateMap 定义:
CreateMap<DataRow, PrivacyStatusData>()
.ForMember(dest => dest.Id, orig => orig.MapFrom(row => (int)row["Id"]))
.ForMember(dest => dest.Name, orig => orig.MapFrom(row => row["Name"].ToString()))
.ForMember(dest => dest.Surname, orig => orig.MapFrom(row => row["Surname"].ToString()))
.ForMember(dest => dest.ConsentList, orig => orig.MapFrom<DataRowToConsentDataResolver>());
解析器:
public class DataRowToConsentDataResolver : IValueResolver<DataRow, PrivacyStatusData, List<ConsentData>>
{
public List<ConsentData> Resolve(DataRow source, PrivacyStatusData destination, List<ConsentData> destMember, ResolutionContext context)
{
var consentDataList = new List<ConsentData>();
for (int i = 9; i < source.Table.Columns.Count; i += 2)
{
var consentData = new ConsentData();
var consentName = source.Table.Columns[i].ColumnName.Replace("Consenso", "");
consentName = consentName.First().ToString().ToUpper() + consentName.Substring(1).ToLower();
consentData.ConsentName = consentName;
if (source[i].ToString() == "1")
consentData.ConsentValue = true;
consentData.ConsentDate = "-";
var dtDate = new DateTime();
if (DateTime.TryParse(source[i + 1].ToString(), out dtDate))
consentData.ConsentDate = dtDate.ToString("dd MMMM yyyy");
consentDataList.Add(consentData);
}
return consentDataList;
}
}
来电者:
private List<PrivacyStatusData> MapDataTableToPrivacyStatusData(DataTable privacyData)
{
var rows = new List<DataRow>(privacyData.Rows.OfType<DataRow>());
var privacyStatusDataList = mapper.Map<List<DataRow>, List<PrivacyStatusData>>(rows);
return privacyStatusDataList;
}