我正在吸引所有用户及其相关角色。它有效,但是男人很慢。
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个用户约为600ms。但是,一旦我尝试添加角色,我最终等待了5-10秒。每个用户只有1或2个角色。这并不是一个巨大的查询。
我尝试使用usermanager GetRolesById(user.Id)
,但这甚至较慢。10 秒。
快速进行此次运行的任何技巧都将不胜感激。
您在这里拥有的是执行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查询!
编辑:查看您的请求,如果您只想将角色作为列表,则可以跳过此示例的第二个投影。(我需要在列表中显示此内容,因此在示例中join。