如何使用automapper将DataTable映射到DTO

本文关键字:映射 DTO DataTable 何使用 automapper | 更新日期: 2023-09-27 18:12:19

我是AutoMapper的新手,有几个关于数据表到对象映射的问题。我有sqlquery代码和sql结果。我想用automapper做对象到对象映射。任何帮助吗?

如何使用automapper将DataTable映射到DTO

我想它可能是这样的(宽行):

AutoMapper.Mapper.CreateMap<DataSet, CompanyModel>()
     .ForMember(m => m.Company, opt => opt.MapFrom(r => r.Tables[0].Columns["Company"]))
     .ForMember(m => m.Customers, opt => opt.MapFrom(r => r.Tables[0].Columns["Customers"]))
     .ForMember(m => m.Amount, opt => opt.MapFrom(r => Double.Parse(r.Tables[0].Columns["Amount"]));

Mapper.Map<List<CompanyModel>>(ds);

提供更多的细节(代码)可能会得到更精确的答案。

看这里用AutoMapper将DataRow转换为Object

现在我基于上面的方法做了这个,到目前为止我只测试了具有基本类型的平面DTO:

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

public static class DtoTransformDataTable<T> where T : new()
{
    public static IEnumerable<T> JustDoIt(DataTable dt)
    {
        Mapper.CreateMap<DataRow, T>().ForAllMembers(m => m.ResolveUsing<CustomResolver>());
        var listOfT = new List<T>();
        foreach (var item in dt.Rows) //Use LINQ to concise
        {
            var dest = Mapper.Map<T>(item);
            listOfT.Add(dest);
        }
        return listOfT;
    }
}

如果您使用的是普通的无类型DataTables/DataSets,我认为Automapper不支持开箱装。

然而,如果你创建一个类型的DataTable/DataSet,那么事情应该工作得更好。类型化的DataSet为每个列提供表行属性,并且应该更容易与AutoMapper一起使用。

我已经好几年没有使用类型化的DataSets了,但是。net仍然支持它们。在这里查看如何设置它们的一些信息。