public static int[] SaveToDatabase(List <DAT_Rom> roms) { // get current rom list List <DAT_Rom> current = DAT_Rom.GetRoms(); int added = 0; int updated = 0; // create temp objects pre-database actions List <DAT_Rom> toAdd = new List <DAT_Rom>(); List <DAT_Rom> toUpdate = new List <DAT_Rom>(); // iterate through each incoming rom foreach (var r in roms) { // attempt rom lookup in current DAT_Rom l = (from a in current where a.md5 == r.md5 && a.pid == r.pid select a).ToList().FirstOrDefault(); if (l == null) { // no entry found toAdd.Add(r); } else { // entry found - update required fields DAT_Rom dr = r; dr.gid = l.gid; dr.rid = l.rid; toUpdate.Add(dr); } } using (var db = new AsniDATAdminDbContext()) { // check for duplicate keys var distinctToAdd = toAdd.GroupBy(x => x.rid).Select(g => g.OrderByDescending(x => x.rid).First()); var distinctToUpdate = toUpdate.GroupBy(x => x.rid).Select(g => g.OrderByDescending(x => x.rid).First()); // update existing entries db.DAT_Rom.UpdateRange(distinctToUpdate); // add new entries db.DAT_Rom.AddRange(distinctToAdd); db.SaveChanges(); added = distinctToAdd.Count(); updated = distinctToUpdate.Count(); return(new int[] { added, updated }); } }
public async void CalculateYearsAndPublishers() { var mySettings = new MetroDialogSettings() { NegativeButtonText = "Cancel Procedure", AnimateShow = false, AnimateHide = false }; int working = 0; string output = "Processing Years & Publishers \n"; var controller = await mw.ShowProgressAsync("Searching Years & Publishers", output, true, settings : mySettings); controller.SetCancelable(true); controller.SetIndeterminate(); await Task.Delay(1000); await Task.Run(() => { // get all games List <DAT_Game> AllGames = DAT_Game.GetGames(); List <DAT_Rom> AllRoms = DAT_Rom.GetRoms(); List <DAT_Game> gWorking = new List <DAT_Game>(); // automated searching first int numGames = AllGames.Where(a => a.year == null || a.publisher == null || a.developer == null).Count(); int skipped = 0; // iterate through each game that does not have a year or publisher set foreach (var game in AllGames.Where(a => a.year == null || a.publisher == null || a.developer == null)) { DAT_Game g = new DAT_Game(); g = game; controller.SetMessage(output + "Number of games to process: " + numGames + "\nFixed: " + gWorking.Count() + "\nSkipped: " + skipped); bool updateNeeded = false; // lookup all roms for this game List <DAT_Rom> search = (from a in AllRoms.Where(x => x.gid == game.gid) select a).ToList(); if (search.Count() > 0) { var yearSearch = (from a in search where a.year != null select a).FirstOrDefault(); var devSearch = (from a in search where a.developer != null select a).FirstOrDefault(); var pubSearch = (from a in search where a.publisher != null select a).FirstOrDefault(); if (yearSearch != null) { g.year = yearSearch.year; updateNeeded = true; } if (pubSearch != null) { g.publisher = pubSearch.publisher; updateNeeded = true; } if (devSearch != null) { g.developer = pubSearch.developer; updateNeeded = true; } } if (updateNeeded == true) { gWorking.Add(g); } else { skipped++; } } // db work DAT_Game.SaveToDatabase(gWorking); working = gWorking.Count(); }); await controller.CloseAsync(); if (controller.IsCanceled) { await mw.ShowMessageAsync("DAT_Game Builder", "Procedure Cancelled"); } else { await mw.ShowMessageAsync("DAT_Game Builder", "Procedure Completed - " + working + " games updated"); } }