C# 如何使用AutoMapper映射对象的子列表

C# 如何使用AutoMapper映射对象的子列表,c#,.net-core,automapper,C#,.net Core,Automapper,我有两个表“User”和“Project”。他们有一对多的关系。 我得到的响应是一个列表,我想将此响应映射到我创建的GetProjectManager的dto,但我不确定如何在AutoMaper配置文件中定义CreateMap。 我从ProjectManager类型的API得到以下响应: 项目经理: [ { "id": 1, "projectId": 1, "userId": 1, "project": { "id": 1, "proj

我有两个表“User”和“Project”。他们有一对多的关系。 我得到的响应是一个列表,我想将此响应映射到我创建的GetProjectManager的dto,但我不确定如何在AutoMaper配置文件中定义CreateMap。 我从ProjectManager类型的API得到以下响应:

项目经理:

[
  {
    "id": 1,
    "projectId": 1,
    "userId": 1,
    "project": {
      "id": 1,
      "projectName": "iDocument-FBAG",
      "plannedStartDate": "2019-07-03T00:00:00",
      "plannedEndDate": "2019-07-10T00:00:00",
      "actualStartDate": null,
      "actualEndDate": null,
      "projectDescription": "The client wants to enhance their existing .Net application. They have a WebForms application that uses DevExpress controls. They would like to start by implementing a chart type and creating a reusable report, also use that reusable report to implement some new reports.",
      "onProjects": [],
      "projectManagers": []
    },
    "user": {
      "firstName": "Abc",
      "lastName": "Efg",
      "isProjectManager": true,
      "registrationTime": "2019-06-28T19:28:55.8386138",
      "employees": null,
      "id": 1,
      "userName": "xyz@abc.com"
    }
  },
  {
    "id": 3,
    "projectId": 8,
    "userId": 1,
    "project": {
      "id": 8,
      "projectName": "Aquatrols-FBAG",
      "plannedStartDate": "2019-07-03T00:00:00",
      "plannedEndDate": "2019-07-10T00:00:00",
      "actualStartDate": null,
      "actualEndDate": null,
      "projectDescription": "The client wants to enhance their existing .Net application. They have a WebForms application that uses DevExpress controls. They would like to start by implementing a chart type and creating a reusable report, also use that reusable report to implement some new reports.",
      "onProjects": [],
      "projectManagers": []
    },
    "user": {
      "firstName": "Abc",
      "lastName": "Efg",
      "isProjectManager": true,
      "registrationTime": "2019-06-28T19:28:55.8386138",
      "employees": null,
      "id": 1,
      "userName": "xyz@abc.com"
    }
  }
]
我想将此响应映射到我创建的Dto(GetProjectManager)

public class GetProjectManager
{
    public string ProjectManagerId { get; set; }
    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public IList<GetProjectDto> GetProjects { get; set; }
}

public  class GetProjectDto
{
    public int ProjectId { get; set; }
    public string ProjectName { get; set; }
    public DateTime PlannedStartDate { get; set; }
    public DateTime PlannedEndDate { get; set; }
    public DateTime? ActualStartDate { get; set; }
    public DateTime? ActualEndDate { get; set; }
    public string ProjectDescription { get; set; }
}


public class ProjectManager
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required]
    public int Id { get; set; }
    [Required]
    public int ProjectId { get; set; }
    [Required]
    public int UserId { get; set; }
    public Project Project { get; set; }
    public AppUsers User { get; set; }
}
公共类GetProjectManager
{
公共字符串ProjectManagerId{get;set;}
公共字符串电子邮件{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共IList GetProjects{get;set;}
}
公共类GetProjectDto
{
公共int ProjectId{get;set;}
公共字符串ProjectName{get;set;}
公共日期时间PlannedStartDate{get;set;}
公共日期时间PlannedEndDate{get;set;}
公共日期时间?实际开始日期{get;set;}
公共日期时间?实际日期{get;set;}
公共字符串ProjectDescription{get;set;}
}
公共类项目经理
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
[必需]
公共int Id{get;set;}
[必需]
公共int ProjectId{get;set;}
[必需]
public int UserId{get;set;}
公共项目{get;set;}
公共AppUsers用户{get;set;}
}

首先,您需要将响应json映射到类型

namespace Response
{
    public class ProjectManager
    {
        public int id { get; set; }
        public int projectId { get; set; }
        public int userId { get; set; }
        public Project project { get; set; }
        public User user { get; set; }
    }

    public class Project
    {
        public int id { get; set; }
        public string projectName { get; set; }
        public DateTime plannedStartDate { get; set; }
        public DateTime plannedEndDate { get; set; }
        public object actualStartDate { get; set; }
        public object actualEndDate { get; set; }
        public string projectDescription { get; set; }
        public object[] onProjects { get; set; }
        public object[] projectManagers { get; set; }
    }

    public class User
    {
        public string firstName { get; set; }
        public string lastName { get; set; }
        public bool isProjectManager { get; set; }
        public DateTime registrationTime { get; set; }
        public object employees { get; set; }
        public int id { get; set; }
        public string userName { get; set; }
    }
}
这是你的dto

namespace Dto
{
    public class GetProjectManager
    {
        public string ProjectManagerId { get; set; }
        public string Email { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public IList<GetProjectDto> GetProjects { get; set; }
    }

    public class GetProjectDto
    {
        public int ProjectId { get; set; }
        public string ProjectName { get; set; }
        public DateTime PlannedStartDate { get; set; }
        public DateTime PlannedEndDate { get; set; }
        public DateTime? ActualStartDate { get; set; }
        public DateTime? ActualEndDate { get; set; }
        public string ProjectDescription { get; set; }
    }
}
名称空间Dto
{
公共类GetProjectManager
{
公共字符串ProjectManagerId{get;set;}
公共字符串电子邮件{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共IList GetProjects{get;set;}
}
公共类GetProjectDto
{
公共int ProjectId{get;set;}
公共字符串ProjectName{get;set;}
公共日期时间PlannedStartDate{get;set;}
公共日期时间PlannedEndDate{get;set;}
公共日期时间?实际开始日期{get;set;}
公共日期时间?实际日期{get;set;}
公共字符串ProjectDescription{get;set;}
}
}
然后,为dto映射的响应创建自动映射配置文件

public class ResponseToDtoProfile : AutoMapper.Profile
{
    public ResponseToDtoProfile()
    {
        CreateMap<Response.Project, Dto.GetProjectDto>()
            .ForMember(dst => dst.ProjectId, opt => opt.MapFrom(src => src.id))
            .ForMember(dst => dst.ProjectName, opt => opt.MapFrom(src => src.projectName))
            .ForMember(dst => dst.PlannedStartDate, opt => opt.MapFrom(src => src.plannedStartDate))
            .ForMember(dst => dst.PlannedEndDate, opt => opt.MapFrom(src => src.plannedEndDate))
            .ForMember(dst => dst.ActualStartDate, opt => opt.MapFrom(src => src.actualStartDate))
            .ForMember(dst => dst.ActualEndDate, opt => opt.MapFrom(src => src.actualEndDate))
            .ForMember(dst => dst.ProjectDescription, opt => opt.MapFrom(src => src.projectDescription));

        CreateMap<Response.ProjectManager, Dto.GetProjectManager>()
            .ForMember(dst => dst.ProjectManagerId, opt => opt.MapFrom(src => src.id))
            .ForMember(dst => dst.FirstName, opt => opt.MapFrom(src => src.user.firstName))
            .ForMember(dst => dst.LastName, opt => opt.MapFrom(src => src.user.lastName))
            .ForMember(dst => dst.GetProjects, opt => opt.MapFrom(src => src.project));
    }
}
公共类响应dtoprofile:AutoMapper.Profile
{
公众回应文件()
{
CreateMap()
.FormMember(dst=>dst.ProjectId,opt=>opt.MapFrom(src=>src.id))
.ForMember(dst=>dst.ProjectName,opt=>opt.MapFrom(src=>src.ProjectName))
.ForMember(dst=>dst.PlannedStartDate,opt=>opt.MapFrom(src=>src.PlannedStartDate))
.FormMember(dst=>dst.PlannedEndDate,opt=>opt.MapFrom(src=>src.PlannedEndDate))
.FormMember(dst=>dst.ActualStartDate,opt=>opt.MapFrom(src=>src.ActualStartDate))
.ForMember(dst=>dst.actualendate,opt=>opt.MapFrom(src=>src.actualendate))
.ForMember(dst=>dst.ProjectDescription,opt=>opt.MapFrom(src=>src.ProjectDescription));
CreateMap()
.ForMember(dst=>dst.ProjectManagerId,opt=>opt.MapFrom(src=>src.id))
.ForMember(dst=>dst.FirstName,opt=>opt.MapFrom(src=>src.user.FirstName))
.ForMember(dst=>dst.LastName,opt=>opt.MapFrom(src=>src.user.LastName))
.ForMember(dst=>dst.GetProjects,opt=>opt.MapFrom(src=>src.project));
}
}
为了投影json数组,让我们在集合上添加一个扩展方法

public static class ExtensionsHelper
{
    public static List<TProjection> ProjectAsCollection<TProjection>(this IEnumerable<object> items) where TProjection : class
    {
        //var adapter = <Create Type Adapter>
        return adapter.Adapt<List<TProjection>>(items);
    }
}
公共静态类扩展助手
{
公共静态列表项目集合(此IEnumerable items),其中tproject:class
{
//变量适配器=
返回适配器。调整(项目);
}
}
最后,您可以将json数组投影到dto

static void Main(string[] args)
{
    string jsonString = "[ { \"id\": 1, \"projectId\": 1, \"userId\": 1, \"project\": { \"id\": 1, \"projectName\": \"iDocument-FBAG\", \"plannedStartDate\": \"2019-07-03T00:00:00\", \"plannedEndDate\": \"2019-07-10T00:00:00\", \"actualStartDate\": null, \"actualEndDate\": null, \"projectDescription\": \"The client wants to enhance their existing .Net application. They have a WebForms application that uses DevExpress controls. They would like to start by implementing a chart type and creating a reusable report, also use that reusable report to implement some new reports.\", \"onProjects\": [], \"projectManagers\": [] }, \"user\": { \"firstName\": \"Abc\", \"lastName\": \"Efg\", \"isProjectManager\": true, \"registrationTime\": \"2019-06-28T19:28:55.8386138\", \"employees\": null, \"id\": 1, \"userName\": \"xyz@abc.com\" } }, { \"id\": 3, \"projectId\": 8, \"userId\": 1, \"project\": { \"id\": 8, \"projectName\": \"Aquatrols-FBAG\", \"plannedStartDate\": \"2019-07-03T00:00:00\", \"plannedEndDate\": \"2019-07-10T00:00:00\", \"actualStartDate\": null, \"actualEndDate\": null, \"projectDescription\": \"The client wants to enhance their existing .Net application. They have a WebForms application that uses DevExpress controls. They would like to start by implementing a chart type and creating a reusable report, also use that reusable report to implement some new reports.\", \"onProjects\": [], \"projectManagers\": [] }, \"user\": { \"firstName\": \"Abc\", \"lastName\": \"Efg\", \"isProjectManager\": true, \"registrationTime\": \"2019-06-28T19:28:55.8386138\", \"employees\": null, \"id\": 1, \"userName\": \"xyz@abc.com\" } } ]";
    var rootObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Response.ProjectManager[]>(jsonString).ToList().ProjectAsCollection<Dto.GetProjectManager>();
}
static void Main(字符串[]args)
{
字符串jsonString=“[{\”id\”:1,“projectId\”:1,“userId\”:1,“project\”:{\“id\”:1,“projectName\”:“iDocument FBAG\”,“plannedStartDate\”:“2019-07-03T00:00:00\”,“plannedEndDate\:“2019-07-10T00:00:00\”,“actualStartDate\”:null,“ActualLendDate\”,“projectDescription\:”客户端希望增强其现有的.Net应用程序。他们有一个使用DevXPress控件的WebForms应用程序。他们希望从实现图表类型和创建可重用报表开始,还可以使用该可重用报表来实现一些新报表。\“,\“onProjects\”:[],\“ProjectManager\”:[],\“user\:{”firstName\“:\'Abc\',\'lastName\':\'Efg\',\'isProjectManager\':true,\'registrationTime\':\'2019-06-28819:28:55.8386138\,\'employees\':null,\'id\':1,\'userName\':\”xyz@abc.com\“}},{“id\”:3,“projectId\”:8,“userId\”:1,“project\”:{“id\”:8,“projectName\”:“Aquatrols FBAG\”,“plannedStartDate\”:“2019-07-03T00:00:00\”\“plannedEndDate\”:\“2019-07-10T00:00:00\”,“actualStartDate\”:null,““actualEndDate\”:null,\“projectDescription\”:\”客户端希望增强其现有的.Net应用程序。他们有一个使用DevXPress控件的WebForms应用程序。他们希望从实现图表类型和创建可重用报表开始,还可以使用该可重用报表来实现一些新报表。\“,\“onProjects\”:[],\“ProjectManager\”:[],\“user\:{”firstName\“:\'Abc\',\'lastName\':\'Efg\',\'isProjectManager\':true,\'registrationTime\':\'2019-06-28819:28:55.8386138\,\'employees\':null,\'id\':1,\'userName\':\”xyz@abc.com\" } } ]";
var rootObject=Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString.ToList().ProjectAsCollection();
}

我希望这能回答这个问题。

首先,您需要将响应json映射到类型

namespace Response
{
    public class ProjectManager
    {
        public int id { get; set; }
        public int projectId { get; set; }
        public int userId { get; set; }
        public Project project { get; set; }
        public User user { get; set; }
    }

    public class Project
    {
        public int id { get; set; }
        public string projectName { get; set; }
        public DateTime plannedStartDate { get; set; }
        public DateTime plannedEndDate { get; set; }
        public object actualStartDate { get; set; }
        public object actualEndDate { get; set; }
        public string projectDescription { get; set; }
        public object[] onProjects { get; set; }
        public object[] projectManagers { get; set; }
    }

    public class User
    {
        public string firstName { get; set; }
        public string lastName { get; set; }
        public bool isProjectManager { get; set; }
        public DateTime registrationTime { get; set; }
        public object employees { get; set; }
        public int id { get; set; }
        public string userName { get; set; }
    }
}
I had to play around with the CreateMap in the AutoMapper profile and it solved my problem. 
这是你的dto

namespace Dto
{
    public class GetProjectManager
    {
        public string ProjectManagerId { get; set; }
        public string Email { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public IList<GetProjectDto> GetProjects { get; set; }
    }

    public class GetProjectDto
    {
        public int ProjectId { get; set; }
        public string ProjectName { get; set; }
        public DateTime PlannedStartDate { get; set; }
        public DateTime PlannedEndDate { get; set; }
        public DateTime? ActualStartDate { get; set; }
        public DateTime? ActualEndDate { get; set; }
        public string ProjectDescription { get; set; }
    }
}
名称空间Dto
{
公共类GetProjectManager
{
公共字符串ProjectManagerId{get;set;}
公共字符串电子邮件{get;set;}
公共字符串名{get;set;}