【发布时间】:2022-01-23 21:24:15
【问题描述】:
这是我对实体框架的查询:
var transportlist = await _context.Set<Transport>()
.Include(transport => transport.TransportState)
.Select(transport =>
new
{
Transport = _mapper.Map<TransportDto>(transport),
TransportState = _mapper.Map<TransportStateForTransportDto>(transport.TransportState),
}
)
.Take(limitNumber)
.ToListAsync();
return transportlist;
这是我的 TransportDto :
public class TransportDto
{
public int TransportId { get; set; }
public TransportStateForTransportDto TransportState { get; set; }
public bool Locked { get; set; }
}
这是我的 TransportStateForTransportDto :
public class TransportStateForTransportDto
{
public string Label { get; set; }
}
我希望得到类似的结果:
[
{
"transportId": 123456,
"transportState" : {
"Label": "Deleted"
},
"locked" : false
}
]
但是,我有这个(这有点合乎逻辑......):
[
{
"transport": {
"transportId": 123456,
"transportState" : {
"Label": "Deleted"
},
"locked" : false
},
"transportstate": {
"Label": "Deleted"
}
}
]
我想过这样做:
var transportlist = await _context.Set<Transport>()
.Include(transport => transport.TransportState)
.Select(transport =>
new
{
_mapper.Map<TransportDto>(transport),
}
)
.Take(limitNumber)
.ToListAsync();
return transportlist;
但是,如果我这样做,JSON 中的属性 transportstate 等于 NULL。
所以我正在尝试进行嵌套映射,其中 Transport 也应该映射其对象属性。请注意,所有属性的名称完全相同。
我写了一个用于映射的配置文件:
public class TransportsProfile : Profile
{
public TransportsProfile()
{
CreateMap<TransportState, TransportStateForTransportDto>();
CreateMap<Transport, TransportDto>();
}
}
提前感谢您的帮助。
【问题讨论】:
-
这不是我所期望的......事实上,在他们的例子中你不会得到我要求的 JSON 格式。此外,我不想手动分配字段,但我想全局映射 dto 以获得更灵活的代码。我如何映射到映射中?
-
你完全误解了。花点时间阅读文档和一些示例。
-
在 EF 调用中直接映射非常危险,因为 it's possible to get very deep calls (back to EF) for navigation properties 和/或通过循环递归进入无限循环。我强烈建议关闭延迟加载(如果您还没有),然后在 EF 调用之外映射您的对象。
-
延迟加载被禁用。那么你认为我应该首先提出我的问题吗?然后,使用获得的列表将其映射到我的 Dto 架构?
标签: entity-framework .net-core automapper dto