简体   繁体   English

如何手动将对象列表映射到DTO列表?

[英]How to manually map a List of object to a list of DTO?

I have these: 我有这些:

public class FamilyHead
{
    public Guid HeadId { get; set; }
    public string Name { get; set; }
}

public class Citizen
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public short Age { get; set; }
    // more properties
    [ForeignKey("FamilyHead")]
    public Guid HeadId { get; set; }

    public virtual FamilyHead FamilyHead { get; set; }
}

public class CitizenDTO
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public short Age { get; set; }
    public Guid HeadId
    public string HeadName { get; set; }
}

I can manually map it via extension method if it is a single instance: 如果是单个实例,我可以通过扩展方法手动将其映射:

public static CitizenDTO ToDTO(this Citizen citizen)
{
    if (citizen == null) return null;

    return new CitizenDTO {
        Id = citizen.Id,
        Name = citizen.Name,
        HeadId = citizen.HeadId,
        HeadName = citizen.FamilyHead.Name
    }   
}

var dto = aCitizen.ToDTO();

But how to map a list of citizens? 但是如何绘制公民名单呢? I think Select() might do the work but I only know how to do it if the model and the dto have a same structure. 我认为Select()可以完成这项工作,但我只知道如果模型和dto具有相同的结构,该怎么做。 Like this example: 像这个例子:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Select(i => i.ToString());

So how to map a list of it? 那么如何映射它的列表呢?

您可以在问题中使用用于string Linq Select() ,而无需编写长扩展方法

IEnumerable<CitizenDTO> dto = citizens.Select(x => x.ToDTO());

I found the answer before finishing my question. 我在完成问题之前就找到了答案。 Just iterate through the list and add mapped DTO to it. 只需遍历列表,然后将映射的DTO添加到该列表即可。 Silly me 傻我

// Extension method
public static IEnumerable<CitizenDTO> ToDTO(this IEnumerable<Citizen> citizens)
{
    if (citizen == null) return null;

    var dto = new List<CitizenDTO>();

    foreach(var citizen in citizens) {
        dto.Add(citizen.ToDTO());   
    }

    return dto;
}

// How to use
IEnumerable<CitizenDTO> result = listOfCitizens.ToDTO();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM