private static async Task <int> InsertRegularsAndVolunteers( IImmutableList <CheckInsUpdate> regularPreCheckIns, KidsTownContext db ) { var kids = regularPreCheckIns .Select(selector: c => c.Kid) .GroupBy(keySelector: p => p.PeopleId).Select(selector: p => p.First()) .ToImmutableList(); var existingPeople = await CommonRepository.GetKidsByPeopleIds( db : db, peopleIds : kids.Where(predicate : p => p.PeopleId.HasValue) .Select(selector : p => p.PeopleId !.Value).ToImmutableList()) .ConfigureAwait(continueOnCapturedContext : false); var peopleUpdates = kids.Where( predicate: p => existingPeople.Select(selector: e => e.PeopleId).Contains(value: p.PeopleId)) .ToImmutableList(); var kidsInserts = kids.Except(second: peopleUpdates).ToImmutableList(); var insertedPeople = await InsertPeople(db : db, peopleToInsert : kidsInserts) .ConfigureAwait(continueOnCapturedContext: false); var checkIns = regularPreCheckIns .Select(selector: c => MapToAttendance(checkInsUpdate: c, people: existingPeople.Union(second: insertedPeople).ToImmutableList())) .ToImmutableList(); await db.AddRangeAsync(entities : checkIns).ConfigureAwait(continueOnCapturedContext: false); return(await db.SaveChangesAsync().ConfigureAwait(continueOnCapturedContext: false)); }
private static async Task <List <Person> > InsertPeople( KidsTownContext db, IImmutableList <PeopleUpdate> peopleToInsert ) { var people = peopleToInsert.Select(selector: MapPerson).ToImmutableList(); await db.AddRangeAsync(entities : people).ConfigureAwait(continueOnCapturedContext: false); await db.SaveChangesAsync().ConfigureAwait(continueOnCapturedContext: false); var insertedPeople = await db.People .Where(predicate : p => peopleToInsert.Select(i => i.PeopleId).Contains(p.PeopleId)) .ToListAsync().ConfigureAwait(continueOnCapturedContext: false); return(insertedPeople); }