为什么在获取用户列表这么慢时获取角色?

时间:2018-03-28 18:47:45

标签: asp.net .net asp.net-web-api2 asp.net-identity

我获取了数据库中的所有用户及其相关角色。它有效,但男人很慢。

        var ctx = new SiteUserContext();
        var ctxUserList = ctx.Users.ToList();


        //var userManager = new UserManager<SiteUser>(new UserStore<SiteUser>(new SiteUserContext()));

        var jsonModels = from user in ctxUserList
                         select new
                         {
                             userName = user.UserName,
                             Roles = (from userRole in user.Roles
                                      join role in ctx.Roles on userRole.RoleId
                                      equals role.Id
                                      select role.Name).ToList(),
                             id = user.Id
                         };

只获得一个用户列表很好,100个用户大约600毫秒。但是一旦我尝试添加角色,我最终会等待5-10秒。每个用户只有1个或2个角色。这不是一个巨大的查询。

我尝试使用userManager GetRolesById(user.Id),但速度更慢。 10秒以上。

任何有关快速运行的提示都将非常感激。

1 个答案:

答案 0 :(得分:0)

您在此处执行N + 1查询以获取信息,因为您获得了用户列表,然后枚举要简化的用户列表。使用LINQ,我们可以更有效地做到这一点。我以前用过这个来完成这个过程。

var usersWithRoles = (from user in ctx.Users  
                      select new  
                       {  
                        UserId = user.Id,                                        
                        Username = user.UserName,  
                        Email = user.Email,  
                        RoleNames = (from userRole in user.Roles  
                                     join role in context.Roles on userRole.RoleId   
                                     equals role.Id  
                                     select role.Name).ToList()  
                                  })
                    .ToList()
                    .Select(p => new   
                    {  
                       UserId = p.UserId,  
                       Username = p.Username,  
                       Email = p.Email,  
                       Role = string.Join(",", p.RoleNames)  
                    });  

这应该更快,并通过1个查询得到它!

编辑:查看您的请求,如果您只想将角色作为列表,则可以跳过此示例中的第二个投影。 (我需要在列表中显示它,因此示例中的string.Join。