转换的DataRow与AutoMapper到对象 [英] Convert DataRow to Object with AutoMapper

查看:519
本文介绍了转换的DataRow与AutoMapper到对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能成功地从IDataReader的映射为对象的列表,但是当我想举一个似乎的DataRow并不如预期的工作。



我缺少简单的东西在这里?

  [的TestFixture] 
公共类AutomapperTest
{
[测试]
公共无效TestMethod1()
{
DataTable的DT =新的DataTable(接触);
dt.Columns.Add(名字);
dt.Columns.Add(姓氏);
dt.Columns.Add(1号线);
dt.Columns.Add(2号线);
dt.Columns.Add(3号线);
dt.Columns.Add(郊区);
dt.Columns.Add(国家);
dt.Columns.Add(邮编);

的DataRow行= dt.NewRow();
row.ItemArray =新[] {小,约翰尼,
1随机的地方,,,
温莎,昆士兰,4030 };

VAR DEST = Mapper.DynamicMap<&myObject的GT;(行);

Assert.AreEqual(行[名字],小);
Assert.IsNotNull(DEST);
Assert.AreEqual(dest.FirstName,小);
}
}

目标类型:

 公共类myObject的
{
公共字符串名字{获得;组; }
公共字符串名字{获得;组; }
公共字符串一号线{搞定;组; }
公共字符串2号线{搞定;组; }
公共字符串3号线{搞定;组; }
公共字符串郊区{搞定;组; }
公共字符串状态{搞定;组; }
公共字符串邮编{搞定;组; }
}


解决方案

您将必须实现自定义的值解析



https://开头github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers



更新

 公共类CustomResolver:IValueResolver 
{
公共ResolutionResult解析(ResolutionResult源)
{
返回source.New (Convert.ChangeType((source.Context.SourceValue作为DataRow中)[source.Context.MemberName],source.Context.DestinationType));
}
}

和这里是如何使用它



  Mapper.CreateMap< DataRow中,myObject的>()ForAllMembers。(M => m.ResolveUsing< CustomResolver>()); 
VAR DEST = Mapper.Map<&myObject的GT;(行);



我建议使用小巧玲珑。这样,你的数据从数据库未来将是强类型或动态的,Automapper应该能够找出映射。



CSV文件可以通过小巧玲珑通过ODBC读,我相信。但对于CSV我推荐的LinqToCSV的NuGet包来。


I can successfully map from IDataReader to a List of objects but when I want to take one DataRow it doesn't seem to work as expected.

Am I missing something simple here?

[TestFixture]
public class AutomapperTest
{
    [Test]
    public void TestMethod1()
    {
        DataTable dt = new DataTable("contact");
        dt.Columns.Add("FirstName");
        dt.Columns.Add("LastName");
        dt.Columns.Add("Line1");
        dt.Columns.Add("Line2");
        dt.Columns.Add("Line3");
        dt.Columns.Add("Suburb");
        dt.Columns.Add("State");
        dt.Columns.Add("Postcode");

        DataRow row = dt.NewRow();
        row.ItemArray = new [] { "Little", "Johnny", 
                                 "1 Random Place", "", "", 
                                 "Windsor", "Qld", "4030" };

        var dest = Mapper.DynamicMap<myObject>(row);

        Assert.AreEqual(row["FirstName"], "Little");
        Assert.IsNotNull(dest);
        Assert.AreEqual(dest.FirstName, "Little");
    }
}

Destination type:

public class myObject
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string Line3 { get; set; }
    public string Suburb { get; set; }
    public string State { get; set; }
    public string Postcode { get; set; }
}

解决方案

You will have to implement your own custom value resolver

https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers

UPDATE

public class CustomResolver : IValueResolver
{
    public ResolutionResult Resolve(ResolutionResult source)
    {
        return source.New( Convert.ChangeType((source.Context.SourceValue as DataRow)[source.Context.MemberName], source.Context.DestinationType));
    }
}

and here is how to use it

Mapper.CreateMap<DataRow,myObject>().ForAllMembers(m=>m.ResolveUsing<CustomResolver>());
var dest = Mapper.Map<myObject>(row);

I recommend using Dapper. That way your data coming from database will be strongly typed or dynamic, and Automapper should be able to figure out the mappings.

CSV files can be read by Dapper through ODBC, I believe. But for CSV I'd recommend the LinqToCSV Nuget package instead.

这篇关于转换的DataRow与AutoMapper到对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆