如何使用automapper

时间:2016-10-08 10:27:26

标签: c# datatable ado.net automapper

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

3 个答案:

答案 0 :(得分:2)

我想它可能会像这样(粗线):

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

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

答案 1 :(得分:1)

看这里Convert DataRow to Object with AutoMapper

现在我基于上面做了这个,到目前为止我只测试了带有原始类型的平面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;
    }
}

答案 2 :(得分:0)

如果您使用简单的无类型DataTables / DataSets,我认为开箱即用的Automapper不支持此功能。

但是,如果您创建了一个键入的DataTable / DataSet,那么事情应该会更好。键入的DataSet为每列提供表行属性,并且应该更易于与AutoMapper一起使用。

我多年没有使用过键入的DataSets,但在.Net中仍然支持它们。 Look here了解有关如何设置它们的一些信息。