public async Task <IdentityResult> Handle(Command request, CancellationToken cancellationToken) { var user = await _userManager.FindByIdAsync(request.Id); var allUserRoles = await _context.UserRoles.Where(x => x.UserId == request.Id) .Join(_context.Roles, ur => ur.RoleId, r => r.Id, (ur, r) => new { r.Id, r.Name }) .ToListAsync(cancellationToken); List <string> rolesToRemove = allUserRoles.Where(x => !request.RolesId.Contains(x.Id)).Select(x => x.Name).ToList(); List <string> rolesId = allUserRoles.Select(x => x.Id).ToList(); List <string> rolesToAddIds = request.RolesId.Where(x => !rolesId.Contains(x)).ToList(); List <string> rolesToAddNames = await _context.Roles.Where(x => rolesToAddIds.Contains(x.Id)) .Select(x => x.Name).ToListAsync(cancellationToken); foreach (string roleName in rolesToRemove) { await _userManager.RemoveFromRoleAsync(user, roleName); } foreach (string roleName in rolesToAddNames) { await _userManager.AddToRoleAsync(user, roleName); } user = UserAggregate.FromState(user).Update(request).State; IdentityResult updateResult = await _userManager.UpdateAsync(user); return(updateResult); }