AutoMapper可查询扩展ProjectTo子对象/属性扩展不起作用 [英] AutoMapper Queryable Extension ProjectTo Child object / Property expansion not working

查看:65
本文介绍了AutoMapper可查询扩展ProjectTo子对象/属性扩展不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是AutoMapper的新手,正在尝试使用ProjectTo扩展名,但是我想我缺少了一些东西.

I am new to AutoMapper and am trying to use the ProjectTo extension, but I guess I'm missing something.

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

For example I created a simple AspNetCore project to test with. Configuring AutoMapper in the Startup.cs ConfigureServices.

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; }
}

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

I then also created this Profile:

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

然后创建DTO:

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

使用映射器可以完美地工作:

Using the mapper works perfectly:

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

地址属性已设置.

使用ProjectTo:

Using ProjectTo:

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

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

The object is mapped in the new list, but Address property is null. What am I missing here?

推荐答案

在使用 ProjectTo 时,需要进行一些类型匹配.您可以参考此示例.

When using ProjectTo, some type matching needs to be done. You can refer to this example.

    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);
    }

它将得到结果.

这篇关于AutoMapper可查询扩展ProjectTo子对象/属性扩展不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆