public async Task ProcessRosters(FixtureRosters rosters, FixtureShots shots, FixtureMatchInfo matchInfo, IDbConnection conn) { var homePlayers = rosters.Home.Values.ToList(); var awayPlayers = rosters.Away.Values.ToList(); var players = homePlayers.Union(awayPlayers).ToList(); var allShots = shots.Home.Union(shots.Away).ToList(); var playerEntities = players.Select(p => new Entities.Player { Id = p.PlayerId, Name = p.PlayerName }).ToList(); await _playerRepository.InsertPlayersAsync(playerEntities, conn); var fixturePlayers = new List <Entities.FixturePlayer>(); foreach (var player in players) { var rosterOutPlayer = players.Find(p => p.Id == player.RosterOut); var rosterInPlayer = players.Find(p => p.Id == player.RosterIn); var fixturePlayer = new Entities.FixturePlayer { ExpectedGoalsBuildup = player.ExpectedGoalsBuildup, ExpectedGoalsChain = player.ExpectedGoalsChain, Minutes = player.Time, Player = new Entities.Player { Id = player.PlayerId }, Position = player.Position, PositionOrder = player.PositionOrder, RedCards = player.RedCard, YellowCards = player.YellowCard, Assists = player.Assists, ExpectedAssists = player.ExpectedAssists, ExpectedGoals = player.ExpectedGoals, FixtureId = matchInfo.Id, Goals = player.Goals, KeyPasses = player.KeyPasses, OwnGoals = player.OwnGoals, Shots = player.Shots, ShotsOnTarget = allShots.Count(s => s.PlayerId == player.PlayerId && (s.Result == "Goal" || s.Result == "SavedShot")), Replaced = rosterOutPlayer == null ? null : new Entities.Player { Id = rosterOutPlayer.PlayerId }, ReplacedBy = rosterInPlayer == null ? null : new Entities.Player { Id = rosterInPlayer.PlayerId }, Team = new Entities.Team { Id = player.TeamId } }; fixturePlayers.Add(fixturePlayer); } await _fixtureRepository.InsertFixturePlayers(fixturePlayers, conn); }