如何使用AutoMapper将DataRow映射到WCF服务中的对象?

BBa*_*r42 2 automapper

我有一个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());
Run Code Online (Sandbox Code Playgroud)

我可以轻松找回客户.现在,我创建了一个Customer对象,如下所示:

public Customer
{
     public string LastName {get;set;}
     public string FirstName {get;set;}
     public int Age {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我从包管理器控制台加载了AutoMapper.然后,我将一个公共静态方法放在我的客户上,如下所示:

public static Customer Get(DataRow dr)
{
     Mapper.CreateMap<DataRow, Customer>();
     return Mapper.Map<DataRow, Customer>(dr);
}
Run Code Online (Sandbox Code Playgroud)

当我单步执行代码时,从Get()返回的客户中的每个属性都为null.我在这里错过了什么?我是否必须添加自定义扩展以从DataRow映射?这是一个似乎相关线程,但我认为AutoMapper会支持这种开箱即用,特别是因为属性名称与列名相同.提前致谢.

BBa*_*r42 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];
}
Run Code Online (Sandbox Code Playgroud)

  • 对于2014年12月29日之后提及此问题的任何人,Automapper项目已取消了对Automapper 4.0及更高版本中"IDataReader"的支持.请参阅[commit](https://github.com/AutoMapper/AutoMapper/commit/33831e3b53ed1cd698558daa2db483906ec5c13a).版本3.1.1(在NuGet上可用)仍具有此功能. (2认同)