0

我有一个名为 Users 的表,其 Id 作为主键,另一个表 Roles,Id 作为主键,还有一个名为 UserRoles 的表,具有 2 个外键 User_Id 和 Role_Id。

在我的代码中,我有一个名为 Role 的类:

public partial class Role
{
   public virtual int Id {get;set;}
   public virtual string RoleName {get;set;}
}

我还有另一个名为 User 的类:

public partial class User
{
    private ICollection<Role> _userRoles;

    ...All Properties...
    public virtual ICollection<Role> UserRoles
    {
        get { return _userRoles ?? (_userRoles = new List<Role>()); }
        protected set { _userRoles = value; }
    }
}

类的映射被正确定义,所以当我得到一个用户时,我得到了他/她所属的角色。现在我想在网格列表中显示角色列表,并希望显示每个角色的用户数量。

我曾尝试使用 join 但我无法达到结果。

有什么想法是最好的方法吗?提前致谢

4

3 回答 3

2

您可以在 Linq 中使用 Aggregate 函数:

        var users = new List<User>();
        var roles = new List<Role>();
        //Populate users and roles

        var rolesAndUsers = new Dictionary<Role, List<User>>();

        users.Aggregate(rolesAndUsers, (d, u) =>
                                           {
                                               ICollection<Role> userRoles = u.UserRoles;
                                               foreach (var userRole in userRoles)
                                               {
                                                   if (!d.ContainsKey(userRole))
                                                       d.Add(userRole, new List<User>());
                                                   d[userRole].Add(u);
                                               }
                                               return d;
                                           });
于 2013-06-05T12:20:40.217 回答
2

将导航属性添加到Role类:

public partial class Role
{
   public virtual int Id {get;set;}
   public virtual string RoleName {get;set;}
   public virtual ICollection<User> Users { get; set; } // Here
}

然后简单地查询每个角色的用户数:

var query = from r in context.Roles
            select new {
                 r.RoleName,
                 UsersCount = r.Users.Count()
            };

生成的 SQL 看起来像

SELECT [Extent1].[Id] AS [Id],
       [Extent1].[RoleName] AS [RoleName],
       (SELECT COUNT(1) AS [A1]
        FROM   [dbo].[UserRoles] AS [Extent2]
        WHERE  [Extent1].[Id] = [Extent2].[Role_Id]) AS [C1]
FROM   [dbo].[Roles] AS [Extent1]

如您所见,将为每个角色生成子查询。运行它,看看你的情况是否可以接受性能。

于 2013-06-05T12:45:46.333 回答
0

您可以合并内部角色列表,然后按角色对列表进行分组,然后获取每个组的计数。

List<User> users = ...;

var roleCounts = users.SelectMany(user => user.UserRoles)
                      .GroupBy(role => role)
                      .Select(roleGroup => new {Role = roleGroup.Key, Count = roleGroup.Count());

foreach (var roleCount in roleCounts)
{
    Role role = roleCount.Role;
    int count = roleCount.Count;
    ...
}
于 2013-06-05T12:47:06.453 回答