如何使用自动映射器将多个列表 <property> 映射到视图模型

How to map several list<property> to view model using automapper

我想知道如何将列表映射到包含相同列表的对象 属性

我有一个如下所示的视图模型:

public class GenerateCodeVM
{
    public List<AnimalVM> Animal { get; set; }

    public List<RegionVM> Region { get; set; }
}

public class AnimalVM
{
    public int? AnimalID { get; set; }

    public string Name { get; set; }

    public string Code { get; set; }

    public DateTime? LastUpdated { get; set; }
}

public class RegionVM
{
    public int? RegionID { get; set; }

    public string RegionName { get; set; }

    public string Code { get; set; }
}

在我的控制器中:

GenerateCodeVM generateCodeVM = new GenerateCodeVM();
AnimalRepository animalRepository = new AnimalRepository();
List<Animal> animal = animalRepository.GetAll().ToList();
RegionRepository regionRepository = new RegionRepository();
List<Region> region = regionRepository.GetAll().ToList();

generateCodeVM = Mapper.Map<List<Region>, GenerateCodeVM> (region);
generateCodeVM = Mapper.Map<List<Animal>, GenerateCodeVM>(animal);

如何在 automapper 中配置映射?

这看起来是一个非常奇怪的解决方案,最后两行覆盖了同一个变量。我建议您将控制器中的最后两行替换为

GenerateCodeVM generateCodeVM = new GenerateCodeVM();
generateCodeVM.Animal = Mapper.Map<List<AnimalVM>>(animal);
generateCodeVM.Region = Mapper.Map<List<RegionVM>>(region);

第一位没问题

GenerateCodeVM generateCodeVM = new GenerateCodeVM();
AnimalRepository animalRepository = new AnimalRepository();
List<Animal> animal = animalRepository.GetAll().ToList();
RegionRepository regionRepository = new RegionRepository();
List<Region> region = regionRepository.GetAll().ToList();

旁边的这些不是。

generateCodeVM = Mapper.Map<List<Region>, GenerateCodeVM> (region);
generateCodeVM = Mapper.Map<List<Animal>, GenerateCodeVM>(animal);

我只会映射到 generateCodeVM 对象而不是整个对象。

所以你需要设置映射。

Mapper.CreateMap<Region, RegionVM>();
Mapper.CreateMap<Animal, AnimalVM>();

那么就可以使用AutoMapper中的project扩展方法了。 只要 GetAll() 返回一个 IQueryable<>

GenerateCodeVM generateCodeVM = new GenerateCodeVM();

AnimalRepository animalRepository = new AnimalRepository();
RegionRepository regionRepository = new RegionRepository();

List<Animal> animal = animalRepository.GetAll().Project().To<AnimalVM>().ToList();

List<Region> region = regionRepository.GetAll().Project().To<RegionVM>.ToList();

然后只需将这些投影列表分配给 generateCodeVM

generateCodeVM.Animal = animal;
generateCodeVM.Region = region;

提示和技巧

如果你不想使用 Project 你可以简单地做:

List<Region> region = regionRepository.GetAll().ToList();
var mappedRegions = Mapper.Map<List<RegionVM>>(region);

您根本不需要更改 CreateMap 来支持它,开箱即用。

我会将你引用列表的变量名复数化,这样你和其他人都可以更清楚地看到你的代码(例如 us/me on SO)。

List<Region> region = regionRepository.GetAll().ToList();

应该是

List<Region> regions = regionRepository.GetAll().ToList();