public async Task <Character> CreateAsync(ICreateCharacterModel createModel) { List <Episode> episodes = await _episodeRepository.GetAllByOrDefaultAsync(x => createModel.Episodes.Contains(x.Name)); List <Character> friends = await _characterRepository.GetAllByOrDefaultAsync(x => createModel.Friends.Contains(x.Name)); return(new Character() { Name = createModel.Name, Friends = friends.Select(x => new CharacterFriend() { FriendCharacterId = x.Id }).ToList(), Episodes = episodes.Select(x => new CharacterEpisode() { EpisodeId = x.Id }).ToList() }); }
private async Task SetCharacterEpisodesAsync(Character characterToUpdate, List <string> episodes) { List <Episode> episodesToAssign = await _episodeRepository.GetAllByOrDefaultAsync(x => episodes.Contains(x.Name)); HashSet <int> episodesToAssignIds = episodesToAssign.Select(x => x.Id).ToHashSet(); List <CharacterEpisode>?episodesToRemove = characterToUpdate.Episodes.Where(x => !episodesToAssignIds.Contains(x.EpisodeId)).ToList(); List <CharacterEpisode>?episodesToAdd = episodesToAssignIds.Where(x => !characterToUpdate.Episodes.Any(y => y.EpisodeId == x)) .Select(episodeId => new CharacterEpisode() { CharacterId = characterToUpdate.Id, EpisodeId = episodeId }).ToList(); episodesToRemove.ForEach(x => characterToUpdate.Episodes.Remove(x)); episodesToAdd.ForEach(x => characterToUpdate.Episodes.Add(x)); }