C# 如何使用AutoMapper映射对象的子列表
我有两个表“User”和“Project”。他们有一对多的关系。 我得到的响应是一个列表,我想将此响应映射到我创建的GetProjectManager的dto,但我不确定如何在AutoMaper配置文件中定义CreateMap。 我从ProjectManager类型的API得到以下响应: 项目经理: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
[
{
"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;}