我有一个WCF服务,它调用存储过程并返回一个DataTable。我想在发送给消费者之前将DataRows转换为自定义对象,但无法弄清楚如何这样做。假设我从存储过程中检索了一个客户。通过DataRow来确保客户的简短:
string lastName = dt.Rows[0]["LastName"].ToString();
string firstName = dt.Rows[0]["FirstName"].ToString();
string age = System.Convert.ToInt32(dt.Rows[0]["Age"].ToString());
我可以轻松找回客户。现在,我创建了一个Customer对象:
public Customer
{
public string LastName {get;set;}
public string FirstName {get;set;}
public int Age {get;set;}
}
我从包管理器控制台加载了AutoMapper。然后,我将一个公共静态方法放在我的客户身上,如下所示:
public static Customer Get(DataRow dr)
{
Mapper.CreateMap<DataRow, Customer>();
return Mapper.Map<DataRow, Customer>(dr);
}
当我单步执行代码时,从Get()返回的客户中的每个属性都为null。我在这里错过了什么?我是否必须添加自定义扩展以从DataRow映射?这是thread that seems related但我认为AutoMapper会支持这种开箱即用,特别是因为属性名称与列名相同。提前谢谢。
答案 0 :(得分:7)
这有效!!
public static Customer GetSingle(DataTable dt)
{
if (dt.Rows.Count > 0) return null;
List<Customer> c = AutoMapper.Mapper.DynamicMap<IDataReader, List<Customer>>(dt.CreateDataReader());
return c[0];
}