我有一个ASP Net Core 2.1项目。
db上下文是使用EF创建的。
这是我的SecGroups和SecGroupRights的数据库模型:

public partial class SecGroups
{
    public SecGroups()
    {
        SecGroupRights = new HashSet<SecGroupRights>();
    }

    public long Id { get; set; }
    public string Name { get; set; }
    public bool? IsReference { get; set; }
    public long? Provider { get; set; }
    public long? Class { get; set; }

    public SecGroups IdNavigation { get; set; }
    public SecGroups InverseIdNavigation { get; set; }
    public ICollection<SecGroupRights> SecGroupRights { get; set; }
}




public partial class SecGroupRights
{
    public long Id { get; set; }
    public long GroupId { get; set; }
    public long RightId { get; set; }

    public SecGroups Group { get; set; }
    public SecRights Right { get; set; }
}


这只是SecGroups和SecGroupRights之间的简单一对多关系。

如果我通过_context获得SecGroup,例如var grDB=_context.SecGroups.FirstOrDefault();,则我总是grDB.SecGroupRights为null(即使它有子级)

我发现我必须使用“包含”来获取它以获取孩子:

var grDB = await _context.SecGroups.Include(a => a.SecGroupRights)
.Where(a => a.Id == myID)
.FirstOrDefaultAsync();


这非常有效,我可以访问SecGroupRights数据并最终获得其计数。

现在,下一步是从SecGroups到此映射创建自定义AutoMapper映射:

public class GroupsDto
{
    public long? Id { get; set; }
    public string Name { get; set; }
    public long? Provider { get; set; }
    public long? Rights { get; set; }
}


因此,在“权利”字段中,我只想要孩子的人数。在我上面的情况中,将是:

grDB.SecGroupRights.Count();


我尝试像这样进行映射:

        CreateMap<SecGroups, GroupsDto>(MemberList.Source)
            .ForMember(d => d.Rights, opt => opt.MapFrom(src => src.SecGroupRights.Count()));


不幸的是,问题在于,在映射SecGroupRights对象时,该对象为空,并且我总是得到0个计数。

因此,我尝试将_context注入到我的Mapping帮助器中,并最终得到以下结果:

        CreateMap<SecGroups, GroupsDto>(MemberList.Source)
        .ForMember(d => d.Rights, opt => opt.MapFrom(src => (
            _context.SecGroupRights.Where(a => a.GroupId==src.Id).Count()

        )));


但是似乎没有错误也没有计数,因此我认为映射器无法访问_context

有什么办法可以在我的映射器中获得此计数?我想念什么吗?
提前致谢。

---------------------------------
编辑:

映射不起作用,因为当我使用映射器时,源中没有SecGroupRights。

因此,作为参考,好的映射是:

CreateMap<SecGroups, GroupsDto>(MemberList.Source)
.ForMember(d => d.Rights, opt => opt.MapFrom(src => src.SecGroupRights.Count()));


我这样称呼它:

var res= _context.SecGroups.Include(a => a.SecGroupRights).ToList();
var mapped = _mapper.Map<List<SecGroups>, List<GroupsDto>>(res);

最佳答案

映射不起作用,因为当我使用映射器时,源中没有SecGroupRights。

因此,作为参考,好的映射是:

CreateMap<SecGroups, GroupsDto>(MemberList.Source)
.ForMember(d => d.Rights, opt => opt.MapFrom(src => src.SecGroupRights.Count()));


我这样称呼它:

var res= _context.SecGroups.Include(a => a.SecGroupRights).ToList();
var mapped = _mapper.Map<List<SecGroups>, List<GroupsDto>>(res);

关于c# - Automapper自定义 map 使用“包含”获取 child 人数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52060213/

10-10 12:57