我正在尝试将我的实体映射到一个新结构中。
我的实体看起来像:
public class Settings
{
public int Id { get; protected set; }
public int UserId { get; set; }
string string Property{ get; set; }
public string Element { get; set; }
public string Value { get; set; }
}
所以从数据库中会得到类似的东西(其中值是一些基于 json 的值)
UserId Property Element Value
----------- ---------- -------- ------
15 std1 grid [...]
15 std1 panel [...]
15 std2 panel [...]
15 std2 grid [...]
15 std4 panel [...]
15 std5 panel [...]
15 std12 grid [...]
我的目标是输出如下结构的内容:
{
"std1": {
"Elements": {
"grid": "[...]",
"panel": "[...]"
}
},
"std2": {
"Elements": {
"grid": "[...]",
"panel": "[...]"
}
},
"std4": {
"Elements": {
"panel": "[...]"
}
},
...
}
我创建了以下 DTO 来实现此目的:
public class SettingsToReturnDto
{
public string Domain { get; set; }
public List<ElementsToReturnDto> Elements { get; set; }
}
public class ElementsToReturnDto
{
public string Element { get; set; }
public string Value { get; set; }
}
}
我尝试使用自动映射器映射来实现这一点,但我所有的尝试都无法转换为新结构
你能给我指出正确的方向吗? 谢谢
最佳答案
这是工作演示,你可以引用
设置配置文件
public class SettingsProfile:Profile
{
public SettingsProfile()
{
CreateMap<IGrouping<string, Settings>, SettingsToReturnDto>()
.ForMember(dest => dest.Domain, opt => opt.MapFrom(src => src.Key))
.ForMember(dest => dest.Elements, opt => opt.MapFrom(src => src.ToList()));
CreateMap<Settings, ElementsToReturnDto>();
}
}
Controller
public class ValuesController : ControllerBase
{
private readonly SeeMiddleContext _context;
private readonly IMapper _mapper;
public ValuesController(SeeMiddleContext context, IMapper mapper)
{
_context = context;
_mapper = mapper;
}
public IActionResult GetSettings()
{
List <IGrouping<string, Settings>> settingsFromDB = _context.Settings.GroupBy(s=>s.Property).ToList();
var settingsToReturn = _mapper.Map<List<IGrouping<string, Settings>>,List<SettingsToReturnDto>>(settingsFromDB);
return new JsonResult(settingsToReturn);
}
}
关于asp.net-core - GroupBy 自动映射器聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57322313/