protected List <dynamic> CreateCommandsInOrder( int huisnummerId, DateTime from, DateTime until) { var importHouseNumberCommands = new List <ImportHouseNumberFromCrab>(); var tblHuisNummerByHuisnummerIdTask = Task.Run(() => RunOnContext(context => AdresHuisnummerQueries.GetTblHuisNummerByHuisnummerId(huisnummerId, context))); var importHouseNumberHistCommandsTask = Task.Run(() => RunOnContext(context => CrabHouseNumberMapper.Map(AdresHuisnummerQueries.GetTblHuisNummerHistByHuisnummerId(huisnummerId, context)).ToList())); var importHouseNumberStatusCommandsTask = Task.Run(() => RunOnContext(context => CrabHouseNumberStatusMapper.Map(AdresHuisnummerQueries.GetTblHuisnummerstatussenByHuisnummerId(huisnummerId, context)).ToList())); var importHouseNumberStatusHistCommandsTask = Task.Run(() => RunOnContext(context => CrabHouseNumberStatusMapper.Map(AdresHuisnummerQueries.GetTblHuisnummerstatussenHistByHuisnummerId(huisnummerId, context)).ToList())); var importHouseNumberPositionCommandsTask = Task.Run(() => RunOnContext(context => CrabHouseNumberPositionMapper.Map(AdresHuisnummerQueries.GetTblAdresPositiesByHuisnummerId(huisnummerId, context)).ToList())); var importHouseNumberPositionHistCommandsTask = Task.Run(() => RunOnContext(context => CrabHouseNumberPositionMapper.Map(AdresHuisnummerQueries.GetTblAdresPositiesHistByHuisnummerId(huisnummerId, context)).ToList())); var importHouseNumberMailCantonCommandsTask = Task.Run(() => RunOnContext(context => CrabHouseNumberMailCantonMapper.Map(AdresHuisnummerQueries.GetTblHuisnummerPostkantonsByHuisnummerId(huisnummerId, context)).ToList())); var importHouseNumberMailCantonHistCommandsTask = Task.Run(() => RunOnContext(context => CrabHouseNumberMailCantonMapper.Map(AdresHuisnummerQueries.GetTblHuisnummerPostKantonsHistByHuisnummerId(huisnummerId, context)).ToList())); Task.WaitAll( tblHuisNummerByHuisnummerIdTask, importHouseNumberHistCommandsTask, importHouseNumberStatusCommandsTask, importHouseNumberStatusHistCommandsTask, importHouseNumberPositionCommandsTask, importHouseNumberPositionHistCommandsTask, importHouseNumberMailCantonCommandsTask, importHouseNumberMailCantonHistCommandsTask); var tblHuisNummerByHuisnummerId = tblHuisNummerByHuisnummerIdTask.Result; if (tblHuisNummerByHuisnummerId != null) { importHouseNumberCommands = new List <ImportHouseNumberFromCrab> { CrabHouseNumberMapper.Map(tblHuisNummerByHuisnummerId) } } ; var importHouseNumberHistCommands = importHouseNumberHistCommandsTask.Result; var importHouseNumberStatusCommands = importHouseNumberStatusCommandsTask.Result; var importHouseNumberStatusHistCommands = importHouseNumberStatusHistCommandsTask.Result; var importHouseNumberPositionCommands = importHouseNumberPositionCommandsTask.Result; var importHouseNumberPositionHistCommands = importHouseNumberPositionHistCommandsTask.Result; var importHouseNumberMailCantonCommands = importHouseNumberMailCantonCommandsTask.Result; var importHouseNumberMailCantonHistCommands = importHouseNumberMailCantonHistCommandsTask.Result; var commandsByHouseNumber = importHouseNumberCommands .Concat(importHouseNumberHistCommands) .OrderBy(x => (Instant)x.Timestamp); var commands = new List <dynamic> { commandsByHouseNumber.First() }; var allHouseNumberCommands = importHouseNumberHistCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 0, 0, $"Huisnummer {x.HouseNumberId}")) .Concat(importHouseNumberCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 0, 1, $"Huisnummer {x.HouseNumberId}"))) .Concat(importHouseNumberStatusHistCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 1, 0, $"Huisnummer {x.HouseNumberId}"))) .Concat(importHouseNumberStatusCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 1, 1, $"Huisnummer {x.HouseNumberId}"))) .Concat(importHouseNumberPositionHistCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 1, 4, $"Huisnummer {x.HouseNumberId}"))) .Concat(importHouseNumberPositionCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 1, 5, $"Huisnummer {x.HouseNumberId}"))) .Concat(importHouseNumberMailCantonHistCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 1, 2, $"Huisnummer {x.HouseNumberId}"))) .Concat(importHouseNumberMailCantonCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 1, 3, $"Huisnummer {x.HouseNumberId}"))) .ToList(); var adresCommands = allHouseNumberCommands .Where(x => x.Item1.Timestamp > from.ToCrabInstant() && x.Item1.Timestamp <= until.ToCrabInstant()) .OrderBy(x => x.Item1.Timestamp) .ThenBy(x => x.Item2) .ThenBy(x => x.Item3); commands.AddRange(adresCommands.Select(adresCommand => adresCommand.Item1)); return(commands); }
protected List <dynamic> CreateCommandsInOrder( ImportMode importMode, int id, DateTime from, DateTime until) { var importSubaddressCommands = new List <ImportSubaddressFromCrab>(); List <ImportSubaddressFromCrab> importSubaddressHistCommands; List <ImportSubaddressStatusFromCrab> importSubaddressStatusCommands; List <ImportSubaddressStatusFromCrab> importSubaddressStatusHistCommands; List <ImportSubaddressPositionFromCrab> importSubaddressPositionCommands; List <ImportSubaddressPositionFromCrab> importSubaddressPositionHistCommands; var importHouseNumberSubaddressCommands = new List <ImportHouseNumberSubaddressFromCrab>(); List <ImportHouseNumberSubaddressFromCrab> importHouseNumberSubaddressCommandsHist; var importSubaddressMailCantonCommands = new List <ImportSubaddressMailCantonFromCrab>(); List <ImportSubaddressMailCantonFromCrab> importSubaddressMailCantonCommandsHist; using (var context = _crabEntitiesFactory()) { var importSubaddressFromCrab = AdresSubadresQueries.GetTblSubadresBySubadresId(id, context); if (importSubaddressFromCrab != null) { importSubaddressCommands = new List <ImportSubaddressFromCrab> { CrabSubaddressMapper.Map(importSubaddressFromCrab) } } ; importSubaddressHistCommands = CrabSubaddressMapper.Map(AdresSubadresQueries.GetTblSubadresHistBySubadresId(id, context)).ToList(); importSubaddressStatusCommands = CrabSubaddressStatusMapper.Map(AdresSubadresQueries.GetTblSubadresstatussesBySubadresId(id, context)).ToList(); importSubaddressStatusHistCommands = CrabSubaddressStatusMapper.Map(AdresSubadresQueries.GetTblSubadresstatussesHistBySubadresId(id, context)).ToList(); importSubaddressPositionCommands = CrabSubaddressPositionMapper.Map(AdresSubadresQueries.GetTblAdrespositiesBySubadresId(id, context)).ToList(); importSubaddressPositionHistCommands = CrabSubaddressPositionMapper.Map(AdresSubadresQueries.GetTblAdrespositiesHistBySubadresId(id, context)).ToList(); var allHouseNumbers = importSubaddressHistCommands.Select(x => (int)x.HouseNumberId).ToList(); if (importSubaddressFromCrab != null) { allHouseNumbers.Add((int)importSubaddressCommands.First().HouseNumberId); } allHouseNumbers = allHouseNumbers.Distinct().ToList(); foreach (var houseNumber in allHouseNumbers) { var tblHuisNummerByHuisnummerId = AdresHuisnummerQueries.GetTblHuisNummerByHuisnummerId(houseNumber, context); if (tblHuisNummerByHuisnummerId != null) { var importHouseNumberSubadresFromCrab = CrabSubaddressHouseNumberMapper.Map(tblHuisNummerByHuisnummerId, id); if (importHouseNumberSubadresFromCrab != null) { importHouseNumberSubaddressCommands.Add(importHouseNumberSubadresFromCrab); } } importSubaddressMailCantonCommands.AddRange( CrabSubaddressMailCantonMapper.GetCommandsFor(AdresHuisnummerQueries.GetTblHuisnummerPostkantonsByHuisnummerId(houseNumber, context), id)); } importHouseNumberSubaddressCommandsHist = CrabSubaddressHouseNumberMapper.Map(AdresHuisnummerQueries.GetTblHuisNummerHistByHuisnummerIds(allHouseNumbers, context), id).ToList(); importSubaddressMailCantonCommandsHist = CrabSubaddressMailCantonMapper.GetCommandsFor(AdresHuisnummerQueries.GetTblHuisnummerPostKantonHistsByHuisnummerIds(allHouseNumbers, context), id).ToList(); } var allSubaddressCommands = importSubaddressHistCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 2, 0, $"Subadres {x.SubaddressId}")) .Concat(importSubaddressCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 2, 1, $"Subadres {x.SubaddressId}"))) .Concat(importSubaddressStatusHistCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 3, 0, $"Subadres {x.SubaddressId}"))) .Concat(importSubaddressStatusCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 3, 1, $"Subadres {x.SubaddressId}"))) .Concat(importSubaddressPositionHistCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 3, 2, $"Subadres {x.SubaddressId}"))) .Concat(importSubaddressPositionCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 3, 3, $"Subadres {x.SubaddressId}"))) .Concat(importHouseNumberSubaddressCommandsHist.Select(x => Tuple.Create <dynamic, int, int, string>(x, 0, 0, $"Subadres {x.SubaddressId}"))) .Concat(importHouseNumberSubaddressCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 0, 1, $"Subadres {x.SubaddressId}"))) .Concat(importSubaddressMailCantonCommandsHist.Select(x => Tuple.Create <dynamic, int, int, string>(x, 1, 0, $"Subadres {x.SubaddressId}"))) .Concat(importSubaddressMailCantonCommands.Select(x => Tuple.Create <dynamic, int, int, string>(x, 1, 1, $"Subadres {x.SubaddressId}"))) .ToList(); var addressCommands = allSubaddressCommands .Where(x => x.Item1.Timestamp > from.ToCrabInstant() && x.Item1.Timestamp <= until.ToCrabInstant()); if (importMode == ImportMode.Update) //if an update changes the subaddress' house number, make sure the commands for that house number are also sent { var houseNumbersForUpdate = importSubaddressCommands .Concat(importSubaddressHistCommands) .Where(x => x.Timestamp > from.ToCrabInstant() && x.Timestamp <= until.ToCrabInstant()) .Select(x => x.HouseNumberId).ToList(); if (houseNumbersForUpdate.Any()) { var houseNumbersBeforeUpdate = importSubaddressCommands .Concat(importSubaddressHistCommands) .Where(x => x.Timestamp <= from.ToCrabInstant()) .Select(x => x.HouseNumberId).ToList(); var newHouseNumbers = houseNumbersForUpdate.Except(houseNumbersBeforeUpdate); foreach (var newHouseNumber in newHouseNumbers) { addressCommands = addressCommands.Concat(allSubaddressCommands.Except(addressCommands).Where(x => //(x.Item1 is ImportSubaddressFromCrab importSubaddressFromCrab && importSubaddressFromCrab.HouseNumberId == newHouseNumber) || (x.Item1 is ImportSubaddressMailCantonFromCrab importSubaddressMailCantonFromCrab && importSubaddressMailCantonFromCrab.HouseNumberId == newHouseNumber) || (x.Item1 is ImportHouseNumberSubaddressFromCrab importHouseNumberSubaddressFromCrab && importHouseNumberSubaddressFromCrab.HouseNumberId == newHouseNumber))); } } } addressCommands = addressCommands.OrderBy(x => x.Item1.Timestamp) .ThenBy(x => x.Item2) .ThenBy(x => x.Item3); var commands = new List <dynamic>(); ImportHouseNumberSubaddressFromCrab initialImportHouseNumberSubaddressFromCrab = null; if (importMode == ImportMode.Init) { initialImportHouseNumberSubaddressFromCrab = importHouseNumberSubaddressCommands .Concat(importHouseNumberSubaddressCommandsHist) .OrderBy(x => (Instant)x.Timestamp) .First(x => x.HouseNumberId == addressCommands.First <ImportSubaddressFromCrab>().HouseNumberId); commands.Add(initialImportHouseNumberSubaddressFromCrab); } foreach (var adresCommand in addressCommands) { if (importMode == ImportMode.Update || !adresCommand.Item1.Equals(initialImportHouseNumberSubaddressFromCrab)) { commands.Add(adresCommand.Item1); } } return(commands); }