首页 > 解决方案 > AutoMapper Queryable Extension ProjectTo 子对象/属性扩展不起作用

问题描述

我是 AutoMapper 的新手,正在尝试使用 ProjectTo 扩展,但我想我错过了一些东西。

例如,我创建了一个简单的 AspNetCore 项目来进行测试。在 Startup.cs ConfigureServices 中配置 AutoMapper。

services.AddAutoMapper(this.GetType().Assembly);

我有这些模型类:

public class PersonDTO
{
    public string Name { get; set; }
    public string AddressStreetName { get; set; }
    public string AddressStreetNumber { get; set; }
    public string AddressCityName { get; set; }
}

public class Address
{
    public string StreetName { get; set; }
    public string StreetNumber { get; set; }
    public string CityName { get; set; }
}

public class Person
{
    public string Name { get; set; }
    public Address Address { get; set; }
}

然后我还创建了这个配置文件:

public class PersonProfile : Profile
{
    public PersonProfile()
    {
        CreateMap<Person, PersonDTO>().ReverseMap();
    }
}

然后创建 DTO:

var personDTO = new PersonDTO()
{
    Name = "John",
    AddressStreetName = "TestStraat",
    AddressStreetNumber = "10",
    AddressCityName = "TestCity"
};

使用映射器非常有效:

var personFromPersonDTO = _mapper.Map<Person>(personDTO);

地址属性已设置。

使用 ProjectTo:

var list = new List<PersonDTO>();
    list.Add(personDTO);
    var listPersons = list
        .AsQueryable()
        .ProjectTo<Person>(_mapper.ConfigurationProvider, m=>m.Address)
        .ToList();

该对象映射到新列表中,但 Address 属性为空。我在这里想念什么?

标签: c#.netasp.net-coreautomapper

解决方案


使用时ProjectTo,需要进行一些类型匹配。你可以参考这个例子。

    public IActionResult Index()
    {
        var personDTO = new PersonDTO()
        {
            Name = "John",
            AddressStreetName = "TestStraat",
            AddressStreetNumber = "10",
            AddressCityName = "TestCity"
        };
        var personFromPersonDTO = mapper.Map<Person>(personDTO);
        var list = new List<PersonDTO>();
        list.Add(personDTO);
     
        //Configure mapping relationship
        var configuration = new MapperConfiguration(cfg =>
        cfg.CreateMap<PersonDTO, Person>()
        .ForMember(p => p.Name, conf => conf.MapFrom(ol => ol.Name))
        .ForMember(p => p.Address, conf => conf.MapFrom(o => new Address
        {
            CityName = o.AddressCityName,
            StreetName = o.AddressStreetName,
            StreetNumber = o.AddressStreetNumber
        }))
        );
        var modelList=list.AsQueryable().ProjectTo<Person>(configuration);
        return Ok(modelList);
    }

它会得到结果。

在此处输入图像描述


推荐阅读