internal void RemoveMembers(int groupId, IEnumerable <int> groupIds, IEnumerable <int> userIds, IEnumerable <int> parentGroupIds) { SecurityGroup group; if (!this.Groups.TryGetValue(groupId, out group)) { return; } if (userIds != null) { foreach (var userId in userIds) { group.UserMemberIds.Remove(userId); Flattener.RemoveUserFromGroup(userId, group, this.Membership, this.Groups); } } // support list for refreshing flattened membership List <int> allUsers; List <int> allParents; if (groupIds != null) { var memberGroups = group.Groups.Where(x => groupIds.Contains(x.Id)).ToArray(); foreach (var memberGroup in memberGroups) { allUsers = Flattener.GetAllUserIds(memberGroup); allParents = Flattener.GetAllParentGroupIdsInclusive(memberGroup); memberGroup.ParentGroups.Remove(group); group.Groups.Remove(memberGroup); // refresh flattening Flattener.DeleteGroup(memberGroup, allUsers, allParents, this.Groups, this.Membership); } } if (parentGroupIds != null) { var parentGroups = group.ParentGroups.Where(x => parentGroupIds.Contains(x.Id)).ToArray(); foreach (var parentGroup in parentGroups) { allUsers = Flattener.GetAllUserIds(parentGroup); allParents = Flattener.GetAllParentGroupIdsInclusive(parentGroup); parentGroup.Groups.Remove(group); group.ParentGroups.Remove(parentGroup); // refresh flattening Flattener.DeleteGroup(parentGroup, allUsers, allParents, this.Groups, this.Membership); } } }