簡體   English   中英

如何使用AutoMapper映射對象的子級列表

[英]How to Map child list of object using AutoMapper

我有這兩個表“用戶”和“項目”。 他們分享一對多的關系。 我得到的響應是一個列表,我想用我創建的GetProjectManager的dto映射此響應,但是我不確定如何在自動映射器配置文件中定義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; }
}

首先,您需要將響應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映射

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

要投影json數組,讓我們在collection上添加擴展方法

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

最后,您可以將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>();
}

我希望能回答這個問題。

I had to play around with the CreateMap in the AutoMapper profile and it solved my problem. 

這就是我定義映射的方式。

CreateMap<ProjectManager, GetProjectDto>()
                            .ForMember(dst => dst.ProjectId, opt => opt.MapFrom(src => src.Project.Id))
                            .ForMember(dst => dst.ProjectName, opt => opt.MapFrom(src => src.Project.ProjectName))
                            .ForMember(dst => dst.PlannedStartDate, opt => opt.MapFrom(src => src.Project.PlannedStartDate))
                            .ForMember(dst => dst.PlannedEndDate, opt => opt.MapFrom(src => src.Project.PlannedEndDate))
                            .ForMember(dst => dst.ActualStartDate, opt => opt.MapFrom(src => src.Project.ActualStartDate))
                            .ForMember(dst => dst.ActualEndDate, opt => opt.MapFrom(src => src.Project.ActualEndDate))
                            .ForMember(dst => dst.ProjectDescription, opt => opt.MapFrom(src => src.Project.ProjectDescription));

                CreateMap<List<ProjectManager>, GetProjectManager>()
                               .ForMember(dst => dst.ProjectManagerId,
                                            opt => opt.MapFrom(src =>
                                                                src.FirstOrDefault().UserId))
                               .ForMember(dst => dst.FirstName,
                                            opt => opt.MapFrom(src =>
                                                                src.FirstOrDefault().User.FirstName))
                               .ForMember(dst => dst.LastName,
                                            opt => opt.MapFrom(src =>
                                                                src.FirstOrDefault().User.LastName))
                               .ForMember(dst => dst.Email,
                                            opt => opt.MapFrom(src =>
                                                                src.FirstOrDefault().User.Email))
                                .ForMember(dst => dst.GetProjects,
                                             opt => opt.MapFrom(src =>
                                                                src.Select(x => new ProjectManager
                                                                {
                                                                    Project = x.Project
                                                                })));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM