public void Execute() { using (ReplaysContext db = new ReplaysContext()) { var records = db.Database.SqlQuery <ReplayAllHotsPlayer>(@"SELECT * FROM ReplayAllHotsPlayers WHERE BattleNetId != 0 GROUP BY BattleNetId HAVING COUNT(*) > 1").ToList(); foreach (var record in records) { var samePlayerRecords = db.ReplayAllHotsPlayers.Where(x => x.BattleNetId == record.BattleNetId).OrderBy(x => x.LastSeen); var listSamePlayerRecords = samePlayerRecords.ToList(); long originalPlayerId = listSamePlayerRecords[0].PlayerId; listSamePlayerRecords[0].Seen = samePlayerRecords.Sum(x => x.Seen); // copy the records over to the RenamedPlayer table for (int i = 1; i < listSamePlayerRecords.Count; i++) { var player = listSamePlayerRecords[i]; ReplayRenamedPlayer replayRenamedPlayer = new ReplayRenamedPlayer { PlayerId = originalPlayerId, BattleTagName = player.BattleTagName, BattleNetId = player.BattleNetId, BattleNetRegionId = player.BattleNetRegionId, BattleNetSubId = player.BattleNetSubId, DateAdded = player.LastSeen, }; db.ReplayRenamedPlayers.Add(replayRenamedPlayer); long oldPlayerId = listSamePlayerRecords[i].PlayerId; // remove from ReplayAllHotsPlayerHero var allHotsPlayerHero = db.ReplayAllHotsPlayerHeroes.Where(x => x.PlayerId == oldPlayerId); db.ReplayAllHotsPlayerHeroes.RemoveRange(allHotsPlayerHero); // update ReplayMatchPlayers db.ReplayMatchPlayers.Where(x => x.PlayerId == oldPlayerId) .ToList() .ForEach(x => x.PlayerId = originalPlayerId); // update ReplayMatchPlayerTalents db.ReplayMatchPlayerTalents.Where(x => x.PlayerId == oldPlayerId) .ToList() .ForEach(x => x.PlayerId = originalPlayerId); // update ReplayMatchPlayerScoreResults db.ReplayMatchPlayerScoreResults.Where(x => x.PlayerId == oldPlayerId) .ToList() .ForEach(x => x.PlayerId = originalPlayerId); // update ReplayMatchTeamObjectives db.ReplayMatchTeamObjectives.Where(x => x.PlayerId == oldPlayerId) .ToList() .ForEach(x => x.PlayerId = originalPlayerId); // update ReplayMatchAwards db.ReplayMatchAwards.Where(x => x.PlayerId == oldPlayerId) .ToList() .ForEach(x => x.PlayerId = originalPlayerId); // remove from ReplayAllHotsPlayer var allHotsPlayer = db.ReplayAllHotsPlayers.Where(x => x.PlayerId == oldPlayerId); db.ReplayAllHotsPlayers.RemoveRange(allHotsPlayer); db.SaveChanges(); } } } }
internal override long UpdateRecord(ReplaysContext db, ReplayAllHotsPlayer model) { ReplayAllHotsPlayer currentRecord; if (model.BattleNetId > 0) { currentRecord = db.ReplayAllHotsPlayers.SingleOrDefault(x => x.BattleNetId == model.BattleNetId && x.BattleNetRegionId == model.BattleNetRegionId && x.BattleNetSubId == model.BattleNetSubId); } else // if its an observer with no battlenetid { if (!string.IsNullOrEmpty(model.BattleNetTId)) { currentRecord = db.ReplayAllHotsPlayers.SingleOrDefault(x => x.BattleNetTId == model.BattleNetTId); } else { currentRecord = db.ReplayAllHotsPlayers.SingleOrDefault(x => x.BattleTagName == model.BattleTagName && x.BattleNetRegionId == model.BattleNetRegionId); } } if (currentRecord != null) { // existing observer record, update the info if (currentRecord.BattleNetId < 1) { currentRecord.BattleNetId = model.BattleNetId; currentRecord.BattleNetRegionId = model.BattleNetRegionId; currentRecord.BattleNetSubId = model.BattleNetSubId; currentRecord.BattleNetTId = model.BattleNetTId; currentRecord.LastSeen = model.LastSeen; currentRecord.LastSeenBefore = model.LastSeenBefore; } if (model.LastSeen > currentRecord.LastSeen) { if (model.BattleTagName != currentRecord.BattleTagName) { ReplayRenamedPlayer samePlayer = new ReplayRenamedPlayer { PlayerId = currentRecord.PlayerId, BattleNetId = currentRecord.BattleNetId, BattleTagName = currentRecord.BattleTagName, BattleNetRegionId = currentRecord.BattleNetRegionId, BattleNetSubId = currentRecord.BattleNetSubId, BattleNetTId = currentRecord.BattleNetTId, DateAdded = model.LastSeen, }; new RenamedPlayer().CreateRecord(db, samePlayer); } currentRecord.BattleTagName = model.BattleTagName; // update the player's battletag, it may have changed currentRecord.BattleNetTId = model.BattleNetTId; currentRecord.LastSeenBefore = currentRecord.LastSeen; // important currentRecord.LastSeen = model.LastSeen; } if (model.AccountLevel > currentRecord.AccountLevel) { currentRecord.AccountLevel = model.AccountLevel; } currentRecord.Seen += 1; db.SaveChanges(); } return(currentRecord.PlayerId); }