GroupBy 自动映射器聚合

Mik*_*ger 3 automapper asp.net-core

我正在尝试将我的实体映射到一个新结构中。

我的实体看起来像:

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

    }
Run Code Online (Sandbox Code Playgroud)

所以从数据库中会出现类似(其中值是一些基于 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     [...]
Run Code Online (Sandbox Code Playgroud)

我的目标是输出结构如下:

{
    "std1": {
        "Elements": {
            "grid": "[...]",
            "panel": "[...]"
        }
    },
    "std2": {
        "Elements": {
            "grid":  "[...]",
            "panel": "[...]"
        }
    },
    "std4": {
        "Elements": {
            "panel": "[...]"
        }
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

我创建了以下 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用自动映射器映射来实现这一点,但我所有的尝试都未能转换为新结构

你能指出我正确的方向吗?谢谢

Xue*_*hen 5

这是工作演示,您可以参考

设置配置文件

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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器

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); 
    }
}
Run Code Online (Sandbox Code Playgroud)