private List <dynamic> CreateCommands(int gemeenteId, DateTime from, DateTime until)
        {
            var importGemeenteCommands         = new List <ImportMunicipalityFromCrab>();
            var importGemeenteHistCommands     = new List <ImportMunicipalityFromCrab>();
            var importGemeenteNaamCommands     = new List <ImportMunicipalityNameFromCrab>();
            var importGemeenteNaamHistCommands = new List <ImportMunicipalityNameFromCrab>();

            using (var crabEntities = _crabEntitiesFactory())
            {
                var gemeente = GemeenteQueries.GetTblGemeentesByGemeenteIds(crabEntities, new HashSet <int> {
                    gemeenteId
                }).SingleOrDefault();
                var gemeenteHists = GemeenteQueries.GetTblGemeenteHistByGemeenteByGemeente(crabEntities, gemeente);
                var namen         = GemeenteQueries.GetTblGemeenteNamenById(crabEntities, gemeente.gemeenteId);
                var namenHists    = GemeenteQueries.GetTblGemeenteNamenHistById(crabEntities, gemeente.gemeenteId);

                importGemeenteHistCommands.AddRange(MunicipalityMappings.GetCommandsFromGemeenteHist(gemeenteHists).ToList());
                importGemeenteCommands.Add(MunicipalityMappings.GetCommandFromGemeente(gemeente));

                importGemeenteNaamHistCommands.AddRange(MunicipalityMappings.GetCommandsFromGemeenteNaamHist(namenHists).ToList());
                importGemeenteNaamCommands.AddRange(MunicipalityMappings.GetCommandsFromGemeenteNaam(namen).ToList());
            }

            var firstCommand = importGemeenteCommands
                               .Concat(importGemeenteHistCommands)
                               .OrderBy(x => x.Timestamp)
                               .First();

            var allCommands = importGemeenteHistCommands.Select(x => Tuple.Create <dynamic, int>(x, 0))
                              .Concat(importGemeenteCommands.Select(x => Tuple.Create <dynamic, int>(x, 1)))
                              .Concat(importGemeenteNaamHistCommands.Select(x => Tuple.Create <dynamic, int>(x, 2)))
                              .Concat(importGemeenteNaamCommands.Select(x => Tuple.Create <dynamic, int>(x, 3)));

            return(new[] { firstCommand }.Concat(allCommands
                                                 .Where(x => x.Item1.Timestamp > from.ToCrabInstant() && x.Item1.Timestamp <= until.ToCrabInstant() && !x.Item1.Equals(firstCommand))
                                                 .OrderBy(x => x.Item1.Timestamp)
                                                 .ThenBy(x => x.Item2)
                                                 .Select(x => x.Item1))
                   .ToList());
        }
        private List <dynamic> CreateCommands(int streetNameId, DateTime from, DateTime until)
        {
            var streetNameCommands           = new List <ImportStreetNameFromCrab>();
            var streetNameHistCommands       = new List <ImportStreetNameFromCrab>();
            var streetNameStatusCommands     = new List <ImportStreetNameStatusFromCrab>();
            var streetNameStatusHistCommands = new List <ImportStreetNameStatusFromCrab>();

            using (var context = _crabEntitiesFactory())
            {
                string primaryLanguage, secondaryLanguage, nisCode;

                var straatnaam     = StraatnaamQueries.GetTblStraatnaamByStraatnaamId(streetNameId, context);
                var straatnaamHist = StraatnaamQueries.GetTblStraatnaamHistByStraatnaamId(streetNameId, context);

                var gemeenteIds = straatnaamHist
                                  .Select(s => s.GemeenteId)
                                  .ToList();

                if (straatnaam != null)
                {
                    primaryLanguage   = straatnaam.tblGemeente.taalcode;
                    secondaryLanguage = straatnaam.tblGemeente.taalCodeTweedeTaal;
                    nisCode           = straatnaam.tblGemeente.NISCode;
                    streetNameCommands.Add(StreetNameMappings.GetCommandFor(straatnaam, primaryLanguage, secondaryLanguage, nisCode));
                    gemeenteIds.Add(straatnaam.GemeenteId);
                }
                else
                {
                    var gemeente = GemeenteQueries.GetTblGemeentesByGemeenteIds(context, new HashSet <int> {
                        straatnaamHist.First().GemeenteId
                    }).First();
                    primaryLanguage   = gemeente.taalcode;
                    secondaryLanguage = gemeente.taalCodeTweedeTaal;
                    nisCode           = gemeente.NISCode;
                }

                gemeenteIds = gemeenteIds.Distinct().ToList();

                if (gemeenteIds.Count > 2)
                {
                    throw new NotImplementedException();
                }

                streetNameHistCommands.AddRange(StreetNameMappings.GetCommandsFor(straatnaamHist, primaryLanguage, secondaryLanguage, nisCode));
                streetNameStatusCommands.AddRange(StreetNameMappings.GetCommandsFor(StraatnaamQueries.GetTblStraatnaamStatusByStraatnaamId(streetNameId, context)));
                streetNameStatusHistCommands.AddRange(StreetNameMappings.GetCommandsFor(StraatnaamQueries.GetTblStraatnaamStatusHistByStraatnaamId(streetNameId, context)));
            }

            var commandsByStreetnaam = streetNameCommands
                                       .Concat(streetNameHistCommands)
                                       .OrderBy(x => x.Timestamp)
                                       .GroupBy(g => (int)g.StreetNameId)
                                       .ToDictionary(x => x.Key, x => x.ToList());

            var commands = new List <dynamic>();

            foreach (var streetNameCommand in commandsByStreetnaam)
            {
                commands.Add(streetNameCommand.Value.OrderBy(x => x.Timestamp).First());
            }

            var allStreetNameCommands = streetNameHistCommands.Select(x => Tuple.Create <dynamic, int>(x, 0))
                                        .Concat(streetNameCommands.Select(x => Tuple.Create <dynamic, int>(x, 1)))
                                        .Concat(streetNameStatusHistCommands.Select(x => Tuple.Create <dynamic, int>(x, 2)))
                                        .Concat(streetNameStatusCommands.Select(x => Tuple.Create <dynamic, int>(x, 3)))
                                        .Where(x => x.Item1.Timestamp > from.ToCrabInstant() && x.Item1.Timestamp <= until.ToCrabInstant())
                                        .OrderBy(x => x.Item1.Timestamp)
                                        .ThenBy(x => x.Item2)
                                        .ToList();

            foreach (var command in allStreetNameCommands)
            {
                commands.Add(command.Item1);
            }

            return(commands);
        }