/// <summary> /// Method for creating a user relationship to a region /// </summary> /// <param name = "user"> User </param> /// <param name = "data"> Data </param> /// <returns> </returns> public async Task RelateUserRegionsAsync(User user, IUserSubmit data) { var oldUserRegions = await _context.UserRegions.Where(x => x.UserId == user.Id).ToListAsync(); var regions = await _context.Regions.Where(v => data.UserRegions.Contains(v.Id)).ToListAsync(); foreach (var oldUserRegion in oldUserRegions) { if (!data.UserRegions.Contains(oldUserRegion.RegionId)) { _context.Remove(oldUserRegion); } } foreach (var region in regions) { if (oldUserRegions.All(x => x.RegionId != region.Id)) { _context.UserRegions.Add(new UserRegion { User = user, UserId = user.Id, Region = region, RegionId = region.Id, }); } } await _context.SaveChangesAsync(); }
/// <summary> /// Creates / updates relationships between user and activity types /// </summary> /// <param name = "user"> </param> /// <param name = "data"> </param> /// <returns> </returns> public async Task RelateUserActivityCategoriesAsync(User user, IUserSubmit data) { var oldActivityCategoryUsersIds = await _context.ActivityCategoryUsers.Where(x => x.UserId == user.Id).Select(x => x.ActivityCategoryId).Distinct().ToListAsync(); var checkForChange = oldActivityCategoryUsersIds.Intersect(data.ActiviyCategoryIds).Count() == oldActivityCategoryUsersIds.Count; if (oldActivityCategoryUsersIds.Count == 0 || !checkForChange) { if (data.IsAllActivitiesSelected) { var allActivityIds = (await _context.ActivityCategories.Select(x => x.Id).ToListAsync()) .Except(oldActivityCategoryUsersIds); foreach (var id in allActivityIds) { _context.ActivityCategoryUsers.Add(new ActivityCategoryUser { ActivityCategoryId = id, UserId = user.Id }); } await _context.SaveChangesAsync(); return; } var allActivityCategories = await _context.ActivityCategories.ToListAsync(); var newHierarchy = new HashSet <int>(GetFullHierarchy(data.ActiviyCategoryIds.ToList(), allActivityCategories)); var itemIdsToDelete = oldActivityCategoryUsersIds.Where(x => !newHierarchy.Contains(x)).ToList(); if (itemIdsToDelete.Count > 0) { int first = 0; int step = 1000; int iterations = itemIdsToDelete.Count / step; int reminder = itemIdsToDelete.Count % step; if (reminder > 0) { ++iterations; } for (int i = 0; i < iterations; i++) { string idsToDelete = GetIdsString(itemIdsToDelete, first, first + step < itemIdsToDelete.Count ? step : itemIdsToDelete.Count - first); await _context.Database.ExecuteSqlCommandAsync($"DELETE FROM ActivityCategoryUsers WHERE ActivityCategory_Id IN ({idsToDelete})"); first += step; } } var itemsToAdd = newHierarchy.Except(oldActivityCategoryUsersIds).Distinct().ToList(); foreach (var id in itemsToAdd) { await _context.ActivityCategoryUsers.AddAsync(new ActivityCategoryUser { ActivityCategoryId = id, UserId = user.Id }); } await _context.SaveChangesAsync(); } }