AutoMapper可查询扩展ProjectTo子对象/属性扩展不起作用 [英] AutoMapper Queryable Extension ProjectTo Child object / Property expansion not working
问题描述
我是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屋!