代码之家  ›  专栏  ›  技术社区  ›  user8107351

如何使用三个表在C#中执行外部联接

  •  1
  • user8107351  · 技术社区  · 7 年前

    我想获得角色列表以及每个角色中的用户总数。到目前为止,这是可行的:

    var result = (from r in _context.UserRoles
                              join u in _context.Users on r.UserId equals u.Id
                              group new { r, u } by new { r.RoleId } into grp
                              select new UserRoleModel { RoleId = (int)grp.FirstOrDefault().r.RoleId, NoOfUsers = grp.Count() }).ToList();
    

    但它不会显示没有任何用户的角色。我有12个角色,其中7个已分配给至少一个用户,而其余5个尚未分配。我想显示所有角色以及分配给它们的用户数,但如果这些角色没有分配给它们的用户(如5个),我希望它返回0作为用户数。谢谢

    2 回复  |  直到 7 年前
        1
  •  1
  •   Emre Kabaoglu    7 年前

    您想申请 left join 你应该使用 DefaultIfEmpty .

    此外,查询中加入的实体是错误的。因为,您应该加入连接实体( UserRole )使用 Role 实体而不是 User 如果要检索分组的角色和对方用户的计数。否则,您永远不知道哪个角色没有用户。

    var result = (from r in _context.Roles
        join ur in _context.UserRoles on r.Id equals ur.RoleId into ps
        from ur in ps.DefaultIfEmpty()
        group new { r,ur } by new { r.Id } into grp
        select new UserRoleModel { RoleId = (int)grp.Key.Id, 
        NoOfUsers = grp.Count(t => t.ur != null) }).ToList();
    

    还有,我建议你改变一下

    (int)grp.FirstOrDefault().r.RoleId

    (int)grp.Key.RoleId
    

    查询按分组 RoleId 已经

    var result = _context.Roles.Select(x => new UserRoleModel
    {
        RoleId = x.Id,
        NoOfUsers = x.UserRoles?.Count() ?? 0
    });
    
        2
  •  0
  •   imanshu15    7 年前

    试试这个,

    var result = (from r in _context.UserRoles
             join u in _context.Users on r.UserId equals u.Id into temp
             from uu in temp.DefaultIfEmpty()
             group new { r, u } by new { r.RoleId } into grp
             select new UserRoleModel { RoleId = (int)grp.FirstOrDefault().r.RoleId, NoOfUsers = grp.Count() }).ToList();