linq 业务对象到DTO的转换

nnt7mjpx  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(144)

我有一个Application类型的列表。我想将该对象转换为ApplicationDTO类型的对象。在Application业务对象中,有一个类型为Applicant的申请人列表。现在我的DTO具有相同的列表,但我正在努力如何将业务对象的列表成员分配给DTO内的列表。我有多个这样的事件,其中不知道我在列表中有多少项。
下面是一个例子:

// List of business objects
List<Application> ApplicationList = await _dbContextDigitVP.Applications.FromSqlRaw("Exec dbo.GetApplication {0}", id).ToListAsync();

//DTO object
ApplicationDTO applicationDTO = new ApplicationDTO
{
    ApplicationNumber = Application.ApplicationNumber,
    Country = Application.Country,
    ApplicationUuid = Application.ApplicationUuid,
    PwEmployeeAdUserName = Application.PwEmployeeAdUserName,
    Category = new ApplicationCategoryDTO
    {
        Category = Application.Category?.Category
    },
    Applicants = new List<ApplicantDTO>()
    {
       // add members of business object                       
    }

};

我可以用for循环来检查它,但是有没有办法在对象定义内部完成呢?

vyswwuz2

vyswwuz21#

您可以使用AutoMapper
一旦你有了你的类型,你就可以使用MapperConfiguration和CreateMap为这两种类型创建一个Map。通常每个AppDomain只需要一个MapperConfiguration示例,并且应该在启动时示例化。

var config = new MapperConfiguration(cfg => cfg.CreateMap<Application, 
ApplicationDTO>());

左边的类型是源类型,右边的类型是目标类型。若要执行Map,请调用Map重载之一:

var mapper = config.CreateMapper();
// or
var mapper = new Mapper(config);
ApplicationDTO dto = mapper.Map<ApplicationDTO>(Application);
91zkwejq

91zkwejq2#

您也可以使用LINQ来转换对象,如不使用AutoMapper。

List<ApplicationDTO> applicationDTOList = ApplicationList.Select(app => new ApplicationDTO
{
    ApplicationNumber = app.ApplicationNumber,
    Country = app.Country,
    ApplicationUuid = app.ApplicationUuid,
    PwEmployeeAdUserName = app.PwEmployeeAdUserName,
    Category = new ApplicationCategoryDTO
    {
        Category = app.Category?.Category
    },
    Applicants = app.Applicants.Select(a => new ApplicantDTO
    {
        // same logic as the above
    }).ToList()
}).ToList();
nc1teljy

nc1teljy3#

可以使用Automapper将数据从一个对象Map到另一个对象。
ApplicationDTOApplicationApplicationCategoryApplicationCategoryDTO以及ApplicantApplicantDTO之间的配置Map创建如下自动Map器配置

var configuration = new MapperConfiguration(cfg => {

  //Source ==> Desti
  //Application and ApplicationDTO classes
  cfg.CreateMap < Application, ApplicationDTO > ()
    .ForMember(dest => dest.Category, opt => opt.MapFrom(src => src.Category))
    .ForMember(dest => dest.Applicants, opt => opt.MapFrom(src => src.Applicants));
  //ApplicationCategory and ApplicationCategoryDTO classes
  cfg.CreateMap < ApplicationCategory, ApplicationCategoryDTO > ();
  //Applicant and ApplicantDTO classes
  cfg.CreateMap < Applicant, ApplicantDTO > ();
});

在构造函数中,可以像下面这样初始化Map器

private readonly IMapper _Mapper;

   public TestController(IMapper mapper) {
            _Mapper = mapper;
   }

当你选角的时候你可以这样做,

var applicationDTOList = _Mapper.Map<List<ApplicationDTO>>(ApplicationList);

相关问题