使用AutoMapper将DataRow转换为Object

 智亚康-Scorpio 发布于 2023-01-04 11:54

我可以成功地从IDataReader映射到对象列表,但是当我想要一个DataRow它似乎没有按预期工作.

我错过了一些简单的东西吗?

[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(row);

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

目的地类型:

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; }
}

Darek.. 9

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

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));
    }
}

以下是如何使用它

Mapper.CreateMap().ForAllMembers(m=>m.ResolveUsing());
var dest = Mapper.Map(row);

我建议使用Dapper.这样,来自数据库的数据将是强类型或动态的,Automapper应该能够找出映射.

我相信Dapper可以通过ODBC读取CSV文件.但对于CSV,我建议使用LinqToCSV Nuget包.

1 个回答
  • 您必须实现自己的自定义值解析器

    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));
        }
    }
    

    以下是如何使用它

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

    我建议使用Dapper.这样,来自数据库的数据将是强类型或动态的,Automapper应该能够找出映射.

    我相信Dapper可以通过ODBC读取CSV文件.但对于CSV,我建议使用LinqToCSV Nuget包.

    2023-01-04 11:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有