c# - Automapper Custom Map 使用 "Include"来获取 child 数

标签 c# linq asp.net-core automapper

我有一个 asp net core 2.1 项目。 数据库上下文是用 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 获取 SecGroups,例如像 var grDB=_context.SecGroups.FirstOrDefault(); 我总是有 grDB.SecGroupRights null(即使它有 child )

我发现我必须使用“Include”来获取它才能获取子项:

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

所以在 Rights 字段中,我只想要 child 的数量。在我上面的场景中是:

grDB.SecGroupRights.Count();

我试着像这样做一个映射:

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

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

所以我尝试在我的 Mapping 助手中注入(inject) _context,结果是这样的:

        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 Custom Map 使用 "Include"来获取 child 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52060213/

相关文章:

c# - 如何使用 Entity Framework 6 在字段中存储对象列表

python - Django channel + 在发布请求后发送 websocket 消息

c# - C# 中有些复杂的正则表达式可以在没有前瞻/后瞻的情况下完成吗?如果不是怎么和他们相处呢?

c# - 常见来源和目的地列表

c# - Linq查询获取最后一条记录

c# - Linq group by 跨不同表的多个字段

c# - 使用 Razor 页面返回 XML?

c# - FFplay成功移入我的Winform,如何设置无边框?

c# 获取具有特定外键的用户列表

c# - 使用 MVC 在 asp.net core 中重定向到上一页 URL - c#