Пример #1
0
        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;
                    }
        }