public void ReadRaceTranspondersTest() { string file = Resources.AFile; var races = new List <Race> { new Race { Heat = 16, Lane = 1, Competitor = new PersonCompetitor { PersonId = new Guid("{4F6178BB-0D05-493C-A600-5A9E2D3C40E1}"), StartNumber = 4, Name = new Name("S.", "Shannon", "Rempel") } } }; var transponders = new List <Transponder> { new Transponder { Code = 111140411, Label = "NZ-77115" }, new Transponder { Code = 102433532, Label = "FG-70236" } }; IList <RaceTransponder> raceTransponders; using (var reader = new StringReader(file)) raceTransponders = AFile.ReadRaceTransponders(reader, races, transponders, false).ToList(); Assert.AreEqual(2, raceTransponders.Count); Assert.AreEqual("Shannon Rempel", raceTransponders[0].Race.Competitor.FullName); Assert.AreEqual(102433532, raceTransponders[1].Transponder.Code); Assert.AreEqual(new Guid("{4F6178BB-0D05-493C-A600-5A9E2D3C40E1}"), raceTransponders[0].PersonId); }
public async Task <ICollection <RaceTransponder> > LoadFromStreamAsync(Guid competitionId, Guid distanceId, Stream stream) { using (var context = contextFactory()) using (var transaction = context.BeginTransaction(IsolationLevel.RepeatableRead)) try { var transponders = await context.Transponders.ToListAsync(); var converter = new MylapsTransponderCodeConverter(); var position = stream.Position; var transpondersReader = new StreamReader(stream, Encoding); var transponderKeyComparer = new TransponderKeyComparer(); var transpondersInFile = AFile.ReadTransponders(transpondersReader, MylapsTransponderCodeConverter.ProChipType, l => { long code; return(converter.TryConvertLabel(MylapsTransponderCodeConverter.ProChipType, l, out code) ? code : new long?()); }); foreach (var transponder in transpondersInFile) { if (!transponders.Contains(transponder, transponderKeyComparer)) { context.Transponders.Add(transponder); transponders.Add(transponder); } } var existingTransponders = await(from r in context.RaceTransponders where r.Race.DistanceId == distanceId select r).ToListAsync(); foreach (var transponder in existingTransponders) { context.RaceTransponders.Remove(transponder); } await context.SaveChangesAsync(); var distance = await context.Distances.FirstAsync(d => d.CompetitionId == competitionId && d.Id == distanceId); var races = await(from r in context.Races.Include(r => r.Competitor) where r.Distance.CompetitionId == competitionId && r.DistanceId == distanceId select r).ToListAsync(); await(from tcm in context.TeamCompetitorMembers.Include(m => m.Member) where tcm.Team.Races.Any(r => r.Distance.CompetitionId == competitionId && r.DistanceId == distanceId) select tcm).LoadAsync(); stream.Seek(position, SeekOrigin.Begin); var raceTransponders = new List <RaceTransponder>(); var raceTranspondersReader = new StreamReader(stream, Encoding); foreach (var transponder in AFile.ReadRaceTransponders(raceTranspondersReader, races, transponders, ShouldReversePeople(distance))) { context.RaceTransponders.Add(transponder); raceTransponders.Add(transponder); } await context.SaveChangesAsync(); transaction.Commit(); return(raceTransponders); } catch { transaction.Rollback(); throw; } }