public void SetRoleCapabilities(int roleId, int[] capabilityIds) { //if there are no caps, it means all caps have been removed if (capabilityIds == null || !capabilityIds.Any()) { _roleCapabilityService.Delete(x => x.RoleId == roleId); return; } //get all the caps of current role var roleCapabilities = _roleCapabilityService.Get(x => x.RoleId == roleId).ToList(); var newCaps = new List <RoleCapability>(); foreach (var cid in capabilityIds) { //if the cap is already there, no need to proceed if (roleCapabilities.Any(x => x.CapabilityId == cid)) { continue; } //add this new role newCaps.Add(new RoleCapability() { RoleId = roleId, CapabilityId = cid }); } //insert new roles _roleCapabilityService.Insert(newCaps.ToArray()); //delete other roles foreach (var capToRemove in roleCapabilities.Where(x => !capabilityIds.Contains(x.CapabilityId))) { _roleCapabilityService.Delete(capToRemove); } }