// ReSharper disable once FunctionComplexityOverflow
 private void WriteOneLine([NotNull] ExcelWorksheet ws, ref int row, [NotNull] BuildingComplex complex)
 {
     foreach (var gebäudeObjectID in complex.GebäudeObjectIDs)
     {
         ws.Cells[row, 1].Value = complex.ComplexName;
         ws.Cells[row, 2].Value = complex.AdressesAsJson.Replace("[", "").Replace("]", "");
         ws.Cells[row, 3].Value = complex.EGIDsAsJson.Replace("[", "").Replace("]", "");
         ws.Cells[row, 4].Value = gebäudeObjectID;
         row++;
     }
 }
        private static bool FindOverlapInEGids([NotNull] BuildingComplex complex1, [NotNull] BuildingComplex complex2)
        {
            foreach (var eGid2 in complex2.EGids)
            {
                if (complex1.EGids.Contains(eGid2))
                {
                    return(true);
                }
            }

            return(false);
        }
        private static bool FindOverlapInStandorte([NotNull] BuildingComplex complex1, [NotNull] BuildingComplex complex2)
        {
            foreach (var complex2Adress in complex2.ObjektStandorte)
            {
                if (complex1.ObjektStandorte.Contains(complex2Adress))
                {
                    return(true);
                }
            }

            return(false);
        }
        private static bool FindOverlapInGebäudeIDs([NotNull] BuildingComplex complex1, [NotNull] BuildingComplex complex2)
        {
            foreach (var complex2Adress in complex2.GebäudeObjectIDs)
            {
                if (complex1.GebäudeObjectIDs.Contains(complex2Adress))
                {
                    return(true);
                }
            }

            return(false);
        }
        private static BuildingComplex CreateNewComplex([NotNull][ItemNotNull] List <BuildingComplex> komplexe, ref int virtualEGIDs, KeyValuePair <string, string> localnetStandort,
                                                        [NotNull] string manuallytranslatedAdress, int gebäudeID)
        {
            var newbc = new BuildingComplex(Guid.NewGuid().ToString(), BuildingComplex.SourceOfEntry.Localnetdata);

            newbc.ObjektStandorte.Add(localnetStandort.Value);
            newbc.AddAdress(manuallytranslatedAdress);
            newbc.EGids.Add(virtualEGIDs--);
            newbc.GebäudeObjectIDs.Add(gebäudeID);
            komplexe.Add(newbc);
            return(newbc);
        }
        private static bool FindOverlapInAdresses([NotNull] BuildingComplex complex1, [NotNull] BuildingComplex complex2)
        {
            foreach (var complex2Adress in complex2.CleanedAdresses)
            {
                if (complex1.CleanedAdresses.Contains(complex2Adress))
                {
                    return(true);
                }
            }

            return(false);
        }
示例#7
0
        protected override void RunActualProcess()
        {
            //string excelFileName = @"U:\SimZukunft\RawDataForMerging\DatenfürEnergiebilanzBurgdorf2018.xlsx";
            var dbRaw           = SqlConnection.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice).Database;
            var dbComplexes     = SqlConnection.GetDatabaseConnection(Stage.Complexes, Constants.PresentSlice).Database;
            var dbComplexEnergy = SqlConnection.GetDatabaseConnection(Stage.ComplexEnergyData, Constants.PresentSlice).Database;
            var dbHouses        = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;

            var complexes = dbComplexes.Fetch <BuildingComplex>();
            //var gwr = dbRaw.Fetch<GwrData>();
            var kanton        = dbRaw.Fetch <EnergiebedarfsdatenBern>();
            var complexEnergy = dbComplexEnergy.Fetch <MonthlyElectricityUsePerStandort>();
            var houses        = dbHouses.Fetch <House>();
            //var heatingSystems = dbHouses.Fetch<HeatingSystemEntry>();
            //var pvSystemEntries = dbHouses.Fetch<PvSystemEntry>();
            //var occupants = dbHouses.Fetch<Occupant>();
            //var businessEntries = dbHouses.Fetch<BusinessEntry>();
            //var households = dbHouses.Fetch<Household>();
            var sonnendach = dbRaw.Fetch <SonnenDach>();

            using (var p = new ExcelPackage())
            {
                //A workbook must have at least on cell, so lets add one...
                var ws = p.Workbook.Worksheets.Add("MySheet");
                //To set values in the spreadsheet use the Cells indexer.
                var columnNumbers = MakeColumnNumberDictionary();
                //header
                foreach (KeyValuePair <Columns, int> pair in columnNumbers)
                {
                    ws.Cells[1, pair.Value].Value = pair.Key.ToString();
                }

                int row = 2;
                foreach (var house in houses)
                {
                    BuildingComplex complex = complexes.Single(x => x.ComplexName == house.ComplexName);
                    //var heatingSystem = heatingSystems.Single(x => x.HouseGuid == house.HouseGuid);
                    //var pvSystem = pvSystemEntries.FirstOrDefault(x => x.HouseGuid == house.HouseGuid);
                    //var houseOccupants = occupants.Where(x => x.HouseGuid == house.HouseGuid).ToList();
                    //var houseBusinessEntries = businessEntries.Where(x => x.HouseGuid == house.HouseGuid).ToList();
                    //var houseHouseholds = households.Where(x => x.HouseGuid == house.HouseGuid).ToList();
                    WriteOneLine(ws, row, columnNumbers, house, kanton,  //gwr,
                                 complexEnergy, complex, sonnendach);
                    row++;
                }
                //Save the new workbook. We haven't specified the filename so use the Save as method.
                var filename = MakeAndRegisterFullFilename("ComparisonEbbeSonnendachLocalnet.xlsx", Name, "", Constants.PresentSlice);
                p.SaveAs(new FileInfo(filename));
                Log(MessageType.Warning, "File: " + filename);
            }
        }
        private static void UpdateComplexWithMissingStandort([NotNull] MyDb db,
                                                             [NotNull] string fullStandort,
                                                             [NotNull] BuildingComplex bc,
                                                             int gebäudeID)
        {
            if (!bc.ObjektStandorte.Contains(fullStandort))
            {
                bc.ObjektStandorte.Add(fullStandort);
            }

            if (!bc.GebäudeObjectIDs.Contains(gebäudeID))
            {
                bc.GebäudeObjectIDs.Add(gebäudeID);
            }

            db.Save(bc);
        }
        private void P01_StartWithEnergieBedarfsdaten()
        {
            var dbsrc   = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var dbdst   = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Complexes, Constants.PresentSlice);
            var energie = dbsrc.Fetch <EnergiebedarfsdatenBern>();

            dbdst.BeginTransaction();
            Debug("Energiebedarfsdaten: Using Energebedarfsdaten as foundation for forming the complexes");
            foreach (var energiebedarfsdatenBern in energie)
            {
                var bc = new BuildingComplex(Guid.NewGuid().ToString(), BuildingComplex.SourceOfEntry.BernData);
                bc.EGids.Add(energiebedarfsdatenBern.egid);
                dbdst.Save(bc);
            }

            dbdst.CompleteTransaction();
            Debug("Energiebedarfsdaten: Saved every building from Energiebedarfsdaten as first complexes");
            dbdst.CloseSharedConnection();
        }
示例#10
0
        // ReSharper disable once FunctionComplexityOverflow
        private void WriteOneLine([NotNull] ExcelWorksheet ws, int row, [NotNull] Dictionary <Columns, int> columnNumbers,
                                  [NotNull] House house, //[ItemNotNull] [NotNull] List<GwrData> gwr,
                                  [ItemNotNull][NotNull] List <EnergiebedarfsdatenBern> kanton,
                                  [ItemNotNull][NotNull] List <MonthlyElectricityUsePerStandort> complexEnergy,
                                  [NotNull] BuildingComplex mycomplex,
                                  //[NotNull] List<Household> households,
                                  [NotNull][ItemNotNull] List <SonnenDach> sonnendachEntries
                                  )
        {
            ws.Cells[row, columnNumbers[Columns.ComplexName]].Value    = house.ComplexName;
            ws.Cells[row, columnNumbers[Columns.Adressen]].Value       = mycomplex.AdressesAsJson;
            ws.Cells[row, columnNumbers[Columns.EGids]].Value          = CleanJson(mycomplex.EGIDsAsJson);
            ws.Cells[row, columnNumbers[Columns.LocalnetISNIds]].Value = CleanJson(mycomplex.GebäudeObjectIDsAsJson);

            /*var gwrs = gwr.Where(x => {Debug.Assert(x.EidgGebaeudeidentifikator_EGID != null, "x.EidgGebaeudeidentifikator_EGID != null");
             *  return mycomplex.EGids.Contains((long)x.EidgGebaeudeidentifikator_EGID);
             * }).ToList();*/

            var ebbes = kanton.Where(x => mycomplex.EGids.Contains(x.egid)).ToList();

            ws.Cells[row, columnNumbers[Columns.EBBE_calc_ehzww]].Value     = ebbes.Sum(x => x.calc_ehzww);
            ws.Cells[row, columnNumbers[Columns.Energiebezugsfläche]].Value = ebbes.Sum(x => x.upd_ebf);

            //energieträger aus ebbe
            //var heizträgerlst = ebbes.Select(x => x.upd_genhz).ToList();
            //ws.Cells[row, columnNumbers[Columns.EBHZ_GZ]].Value = ebbes.Where(x=> x.upd_genhz == 7203).Sum(x => x.calc_ehz);
            //ws.Cells[row, columnNumbers[Columns.EBWW_GZ]].Value = ebbes.Where(x => x.upd_genhz == 7203).Sum(x => x.calc_ehz);
            //ws.Cells[row, columnNumbers[Columns.EBHZWW]].Value = ebbes.Where(x => x.upd_genhz == 7203).Sum(x => x.calc_ehz);
            //warmwasser aus Ebbe
            //ws.Cells[row, columnNumbers[Columns.EBWW_GZ]].Value = ebbes.Where(x => x.upd_genww == 7203).Sum(x => x.calc_eww);
            // ws.Cells[row, columnNumbers[Columns.Energiebezugsfläche]].Value = ebbes.Sum(x=> x)
            var monthlies = complexEnergy.Where(x => mycomplex.CleanedStandorte.Contains(x.CleanedStandort)).ToList();

            ws.Cells[row, columnNumbers[Columns.Localnet_Gas]].Value   = monthlies.Sum(x => x.YearlyGasUse);
            ws.Cells[row, columnNumbers[Columns.Localnet_Wärme]].Value = monthlies.Sum(x => x.YearlyFernwaermeUse);
            var    sd  = sonnendachEntries.Where(x => mycomplex.EGids.Contains(x.gwr_egid)).ToList();
            double sum = sd.Sum(x => x.bedarf_heizung + x.bedarf_warmwasser);

            ws.Cells[row, columnNumbers[Columns.BFH_SonnendachHeizung]].Value = sum;
        }
        private bool FindManualMerges([NotNull] BuildingComplex complex1, [NotNull] BuildingComplex complex2,
                                      [NotNull][ItemNotNull] List <ComplexesToMerge> manualMerges, [NotNull][ItemNotNull] HashSet <string> manualMergeHash)
        {
            if (!manualMergeHash.Contains(complex1.ComplexName))
            {
                return(false);
            }
            foreach (ComplexesToMerge merge in manualMerges)
            {
                if (merge.ComplexName1 == complex1.ComplexName && merge.ComplexName2 == complex2.ComplexName)
                {
                    merge.IsProcessed = true;
                    return(true);
                }
                if (merge.ComplexName1 == complex2.ComplexName && merge.ComplexName2 == complex1.ComplexName)
                {
                    merge.IsProcessed = true;
                    return(true);
                }
            }

            return(false);
        }
示例#12
0
        // ReSharper disable once FunctionComplexityOverflow
        private static void WriteOneLine([NotNull] ExcelWorksheet ws,
                                         int row,
                                         [NotNull] Dictionary <Column, int> columnNumbers,
                                         [NotNull] House house,
                                         [ItemNotNull][NotNull] List <GwrData> gwr,
                                         [ItemNotNull][NotNull] List <EnergiebedarfsdatenBern> kanton,
                                         [ItemNotNull][NotNull] List <MonthlyElectricityUsePerStandort> complexEnergy,
                                         [NotNull] BuildingComplex mycomplex,
                                         [NotNull] HeatingSystemEntry heatingSystem,
                                         [NotNull][ItemNotNull] List <Occupant> occupants,
                                         [NotNull][ItemNotNull] List <BusinessEntry> businessEntries,
                                         [CanBeNull] PvSystemEntry pvsystem,
                                         [NotNull][ItemNotNull] List <Household> households,
                                         [NotNull][ItemNotNull] List <CarDistanceEntry> carDistances,
                                         [NotNull] HouseComponentRepository hcr)
        {
            ws.Cells[row, columnNumbers[Column.ComplexName]].Value    = house.ComplexName;
            ws.Cells[row, columnNumbers[Column.Adressen]].Value       = mycomplex.AdressesAsJson;
            ws.Cells[row, columnNumbers[Column.EGids]].Value          = CleanJson(mycomplex.EGIDsAsJson);
            ws.Cells[row, columnNumbers[Column.LocalnetISNIds]].Value = CleanJson(mycomplex.GebäudeObjectIDsAsJson);
            ws.Cells[row, columnNumbers[Column.GeoKoordinaten]].Value = CleanJson(mycomplex.GeoCoordsAsJson);
            var gwrs = gwr.Where(x => {
                if (x.EidgGebaeudeidentifikator_EGID == null)
                {
                    throw new FlaException("x.EidgGebaeudeidentifikator_EGID != null");
                }

                return(mycomplex.EGids.Contains((long)x.EidgGebaeudeidentifikator_EGID));
            }).ToList();

            ws.Cells[row, columnNumbers[Column.WG_GWR_GebäudeAnzahl]].Value = gwrs.Count;

            var ebbes = kanton.Where(x => mycomplex.EGids.Contains(x.egid)).ToList();

            ws.Cells[row, columnNumbers[Column.WG_GEAK_Anzahl]].Value      = ebbes.Sum(x => x.has_geak);
            ws.Cells[row, columnNumbers[Column.EBBE_GebäudeTyp]].Value     = CollapseList(ebbes.Select(x => x.upd_gtyp));
            ws.Cells[row, columnNumbers[Column.EBBE_GebäudeTyp]].Value     =
                ws.Cells[row, columnNumbers[Column.GWR_WG]].Value          = gwrs.Sum(x => x.AnzahlWohnungen_GANZWHG);
            ws.Cells[row, columnNumbers[Column.EBBE_GArea]].Value          = ebbes.Sum(x => x.garea);
            ws.Cells[row, columnNumbers[Column.EBBE_EBF_HZ_Updated]].Value = ebbes.Sum(x => x.upd_ebf);
            ws.Cells[row, columnNumbers[Column.EBBE_calc_ehzww]].Value     = ebbes.Sum(x => x.calc_ehzww);
            ws.Cells[row, columnNumbers[Column.EBBE_calc_ehz]].Value       = ebbes.Sum(x => x.calc_ehz);
            ws.Cells[row, columnNumbers[Column.EBBE_calc_eww]].Value       = ebbes.Sum(x => x.calc_eww);

            //energieträger aus ebbe
            var  heizträgerlst = ebbes.Select(x => x.upd_genhz).ToList();
            long heizträger    = 0;

            if (heizträgerlst.Count > 0)
            {
                heizträger = heizträgerlst[0];
            }

            switch (heizträger)
            {
            case 0:
                break;

            case 7200:
                break;

            case 7201:
                ws.Cells[row, columnNumbers[Column.EBHZ_OL]].Value = ebbes.Sum(x => x.calc_ehz);
                break;

            case 7202:
                ws.Cells[row, columnNumbers[Column.EBHZ_KO]].Value = ebbes.Sum(x => x.calc_ehz);
                break;

            case 7203:
                ws.Cells[row, columnNumbers[Column.EBHZ_GZ]].Value = ebbes.Sum(x => x.calc_ehz);
                break;

            case 7204:
                ws.Cells[row, columnNumbers[Column.EBHZ_EL]].Value = ebbes.Sum(x => x.calc_ehz);
                break;

            case 7205:
                ws.Cells[row, columnNumbers[Column.EBHZ_HO]].Value = ebbes.Sum(x => x.calc_ehz);
                break;

            case 7206:
                ws.Cells[row, columnNumbers[Column.EBHZ_WP]].Value = ebbes.Sum(x => x.calc_ehz);
                break;

            case 7207:
                ws.Cells[row, columnNumbers[Column.EBHZ_SO]].Value = ebbes.Sum(x => x.calc_ehz);
                break;

            case 7208:
                ws.Cells[row, columnNumbers[Column.EBHZ_FW]].Value = ebbes.Sum(x => x.calc_ehz);
                break;

            case 7209:
                ws.Cells[row, columnNumbers[Column.EBHZ_A]].Value = ebbes.Sum(x => x.calc_ehz);
                break;

            default: throw new Exception("Unknown Heizungsträger: " + heizträger);
            }

            //warmwasser aus Ebbe
            var  wwträgerlst = ebbes.Select(x => x.upd_genww).ToList();
            long wwträger    = 0;

            if (wwträgerlst.Count > 0)
            {
                wwträger = wwträgerlst[0];
            }

            switch (wwträger)
            {
            case 0:
                break;

            case 7200:
                break;

            case 7201:
                ws.Cells[row, columnNumbers[Column.EBWW_OL]].Value = ebbes.Sum(x => x.calc_eww);
                break;

            case 7202:
                ws.Cells[row, columnNumbers[Column.EBWW_KO]].Value = ebbes.Sum(x => x.calc_eww);
                break;

            case 7203:
                ws.Cells[row, columnNumbers[Column.EBWW_GZ]].Value = ebbes.Sum(x => x.calc_eww);
                break;

            case 7204:
                ws.Cells[row, columnNumbers[Column.EBWW_EL]].Value = ebbes.Sum(x => x.calc_eww);
                break;

            case 7205:
                ws.Cells[row, columnNumbers[Column.EBWW_HO]].Value = ebbes.Sum(x => x.calc_eww);
                break;

            case 7206:
                ws.Cells[row, columnNumbers[Column.EBWW_WP]].Value = ebbes.Sum(x => x.calc_eww);
                break;

            case 7207:
                ws.Cells[row, columnNumbers[Column.EBWW_SO]].Value = ebbes.Sum(x => x.calc_eww);
                break;

            case 7208:
                ws.Cells[row, columnNumbers[Column.EBWW_FW]].Value = ebbes.Sum(x => x.calc_eww);
                break;

            case 7209:
                ws.Cells[row, columnNumbers[Column.EBWW_A]].Value = ebbes.Sum(x => x.calc_eww);
                break;

            default: throw new Exception("Unknown Heizungsträger: " + heizträger);
            }

            ws.Cells[row, columnNumbers[Column.EBBE_EnergieträgerHz]].Value = CollapseList(ebbes.Select(x => x.upd_genhz.ToString()));
            ws.Cells[row, columnNumbers[Column.EBBE_EnergieträgerWW]].Value = CollapseList(ebbes.Select(x => x.upd_genww.ToString()));
            //entries from localnet
            var monthlies = complexEnergy.Where(x => mycomplex.CleanedStandorte.Contains(x.CleanedStandort)).ToList();

            ws.Cells[row, columnNumbers[Column.Localnet_Strom]].Value           = monthlies.Sum(x => x.YearlyElectricityUseNetz);
            ws.Cells[row, columnNumbers[Column.Localnet_Gas]].Value             = monthlies.Sum(x => x.YearlyGasUse);
            ws.Cells[row, columnNumbers[Column.Localnet_Wärme]].Value           = monthlies.Sum(x => x.YearlyFernwaermeUse);
            ws.Cells[row, columnNumbers[Column.BFH_EnergieträgerHeizung]].Value = heatingSystem.SynthesizedHeatingSystemType.ToString();
            ws.Cells[row, columnNumbers[Column.BFH_EnergieBedarfHeizung]].Value = heatingSystem.EffectiveEnergyDemand;
            ws.Cells[row, columnNumbers[Column.BFH_Einwohner]].Value            = occupants.Count;
            var businessTypes   = businessEntries.Select(x => x.BusinessType.ToString()).Distinct().ToList();
            var businessTypeStr = string.Join(",", businessTypes);

            ws.Cells[row, columnNumbers[Column.BFH_Geschäfte]].Value = businessTypeStr;
            if (pvsystem != null)
            {
                ws.Cells[row, columnNumbers[Column.BFH_PVSystemGrösseInKWh]].Value = pvsystem.EffectiveEnergyDemand;
            }

            ws.Cells[row, columnNumbers[Column.BFH_Geschäfte]].Value         = businessTypeStr;
            ws.Cells[row, columnNumbers[Column.BFH_StromHaushalteLow]].Value = households.Sum(x => x.LocalnetLowVoltageYearlyTotalElectricityUse);
            ws.Cells[row, columnNumbers[Column.BFH_StromHaushalteLow]].Value = households.Sum(x => x.LocalnetHighVoltageYearlyTotalElectricityUse);
            ws.Cells[row, columnNumbers[Column.BFH_StromGewerbeLow]].Value   = businessEntries.Sum(x => x.LocalnetLowVoltageYearlyTotalElectricityUse);
            ws.Cells[row, columnNumbers[Column.BFH_StromGewerbeHigh]].Value  =
                businessEntries.Sum(x => x.LocalnetHighVoltageYearlyTotalElectricityUse);
            ws.Cells[row, columnNumbers[Column.FeuerungsstättenArt]].Value            = heatingSystem.FeuerungsstättenType;
            ws.Cells[row, columnNumbers[Column.FeuerungsstättenKesselLeistung]].Value = heatingSystem.FeuerungsstättenPower;
            if (heatingSystem.FeuerungsstättenType == "Gas")
            {
                ws.Cells[row, columnNumbers[Column.FeuerungsstättenJahresEnergie1500hGas]].Value =
                    heatingSystem.EstimatedMinimumEnergyFromFeuerungsStätten;
                ws.Cells[row, columnNumbers[Column.FeuerungsstättenJahresEnergie2200hGas]].Value =
                    heatingSystem.EstimatedMaximumEnergyFromFeuerungsStätten;
            }

            if (heatingSystem.FeuerungsstättenType == "Oel")
            {
                ws.Cells[row, columnNumbers[Column.FeuerungsstättenJahresEnergie1500hOel]].Value =
                    heatingSystem.EstimatedMinimumEnergyFromFeuerungsStätten;
                ws.Cells[row, columnNumbers[Column.FeuerungsstättenJahresEnergie2200hOel]].Value =
                    heatingSystem.EstimatedMaximumEnergyFromFeuerungsStätten;
            }

            ws.Cells[row, columnNumbers[Column.BFH_AnzahlFahrzeuge]].Value         = carDistances.Count;
            ws.Cells[row, columnNumbers[Column.BFH_SummeAutoPendlerdistanz]].Value = carDistances.Sum(x => x.CommutingDistance) * 365;
            ws.Cells[row, columnNumbers[Column.BFH_SummeAutoGesamtdistanz]].Value  = carDistances.Sum(x => x.TotalDistance) * 365;
            ws.Cells[row, columnNumbers[Column.BFH_SonnendachPotential]].Value     = heatingSystem.FeuerungsstättenPower;
            ws.Cells[row, columnNumbers[Column.TrafoKreis]].Value = string.Join(";", house.Hausanschluss.Select(x => x.Trafokreis));
            var houseComponents = house.CollectHouseComponents(hcr);
            Dictionary <HouseComponentType, double> houseComponentSums = new Dictionary <HouseComponentType, double>();

            foreach (var hc in houseComponents)
            {
                if (!houseComponentSums.ContainsKey(hc.HouseComponentType))
                {
                    houseComponentSums.Add(hc.HouseComponentType, 0);
                }

                houseComponentSums[hc.HouseComponentType] += hc.EffectiveEnergyDemand;
            }

            foreach (var entry in houseComponentSums)
            {
                Column mycol = GetColumn(entry.Key);
                ws.Cells[row, columnNumbers[mycol]].Value = entry.Value;
            }
        }
        private void P03_AddGwrAdressen()
        {
            Debug("GWRAdressen:adding adressen from gwr");
            var dbraw       = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var dbcomplex   = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Complexes, Constants.PresentSlice);
            var complexes   = dbcomplex.Fetch <BuildingComplex>();
            var gwrAdresses = dbraw.Fetch <GwrAdresse>();

            Debug("GWRAdressen:Found a total of " + gwrAdresses.Count);
            dbcomplex.BeginTransaction();
            var addedNewComplex        = 0;
            var addedSingleComplex     = 0;
            var addedMultipleComplexes = 0;
            var coordsAddded           = 0;

            foreach (var adr in gwrAdresses)
            {
                var             existingComplexes = complexes.Where(x => x.EGids.Contains(adr.EidgGebaeudeidentifikator_EGID)).ToList();
                BuildingComplex bc;
                if (existingComplexes.Count == 0)
                {
                    bc = new BuildingComplex(Guid.NewGuid().ToString(), BuildingComplex.SourceOfEntry.GWRData);
                    bc.EGids.Add(adr.EidgGebaeudeidentifikator_EGID);
                    existingComplexes.Add(bc);
                    complexes.Add(bc);
                    addedNewComplex++;
                }
                else
                {
                    bc = existingComplexes[0];
                    if (existingComplexes.Count == 1)
                    {
                        addedSingleComplex++;
                    }
                    else
                    {
                        addedMultipleComplexes++;
                    }
                }

                var addresse     = adr.Strassenbezeichnung_DSTR + " " + adr.EingangsnummerGebaeude_DEINR;
                var cleanAdresse = Helpers.CleanAdressString(addresse);
                // ReSharper disable twice PossibleInvalidOperationException
                if (adr.XKoordinate_DKODX != null)
                {
                    bc.Coords.Add(new GeoCoord(adr.XKoordinate_DKODX.Value, adr.YKoordinate_DKODY.Value));
                    coordsAddded++;
                }

                if (!bc.CleanedAdresses.Contains(cleanAdresse))
                {
                    bc.AddAdress(addresse);
                }

                dbcomplex.Save(bc);
            }

            Debug("GWRAdressen:Added new complexes: " + addedNewComplex);
            Debug("GWRAdressen:Added Addresses to single complexes: " + addedSingleComplex);
            Debug("GWRAdressen:Added Addresses to multiple complexes: " + addedMultipleComplexes);
            Debug("GWRAdressen:Coords added to:" + coordsAddded);
            var totalComplexes     = complexes.Count;
            var complexesWithCoord = complexes.Count(x => x.Coords.Count > 0);

            Debug("GWRAdressen: " + complexesWithCoord + " / " + totalComplexes + " have an coordinate");
            dbcomplex.CompleteTransaction();
        }
        private void P02_AddFeuerungsstaettenAdressDataAsComplexes()
        {
            Debug("Feuerungsstätten:Starting to add adressen from feurungsstätten");
            var dbComplexes       = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Complexes, Constants.PresentSlice);
            var dbRaw             = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var complexes         = dbComplexes.Fetch <BuildingComplex>();
            var feuerungsStaetten = dbRaw.Fetch <FeuerungsStaette>();

            Debug("Feuerungsstätten:Found " + feuerungsStaetten.Count);
            var vegid        = -1000;
            var missingCount = 1;

            foreach (var staette in feuerungsStaetten)
            {
                if (staette.EGID == -99)
                {
                    staette.EGID = vegid--;
                    Debug("Feuringsstätte missing EGID #" + missingCount);
                    missingCount++;
                }
            }

            Debug("Feuerungsstätten: Total missing Count: " + missingCount);
            dbComplexes.BeginTransaction();
            Debug("Feuerungsstätten: Trying to add the adresses from the feurungsstätten to the building complexes");
            var newComplexesCreated         = 0;
            var assignedToExactlyOneComplex = 0;
            var multiplePossibleComplexes   = 0;

            foreach (var fs in feuerungsStaetten)
            {
                if (fs.EGID == null)
                {
                    throw new FlaException("fs.EGID != null");
                }

                var             existingComplexes = complexes.Where(x => x.EGids.Contains(fs.EGID.Value)).ToList();
                BuildingComplex bc;
                if (existingComplexes.Count == 0)
                {
                    newComplexesCreated++;
                    bc = new BuildingComplex(Guid.NewGuid().ToString(), BuildingComplex.SourceOfEntry.Feuerungsstaetten);
                    bc.EGids.Add(fs.EGID.Value);
                    existingComplexes.Add(bc);
                }
                else
                {
                    //just use the first complex that is found to assign the adress
                    if (existingComplexes.Count == 1)
                    {
                        assignedToExactlyOneComplex++;
                    }
                    else
                    {
                        multiplePossibleComplexes++;
                    }

                    bc = existingComplexes[0];
                }

                var addresse = fs.Strasse + " " + fs.Hausnummer;
                bc.AddAdress(addresse);
                dbComplexes.Save(bc);
            }

            Debug("Feuerungsstätten: Newly created Complexes: " + newComplexesCreated);
            Debug("Feuerungsstätten: Assigned to exactly one complex: " + assignedToExactlyOneComplex);
            Debug("Feuerungsstätten: Assigned to exactly one complex out of multiple possible ones: " + multiplePossibleComplexes);
            dbComplexes.CompleteTransaction();
            dbComplexes.CloseSharedConnection();
            Debug("Feuerungsstätten:finished adding adressen from feurungsstätten");
        }
        private static void PerformActualComplexMerge([NotNull] BuildingComplex c2, [NotNull] BuildingComplex c1, [NotNull] Database dbComplex)
        {
            foreach (var c2EGid in c2.EGids)
            {
                if (!c1.EGids.Contains(c2EGid))
                {
                    c1.EGids.Add(c2EGid);
                }
            }

            foreach (var c2Adress in c2.Adresses)
            {
                if (!c1.Adresses.Contains(c2Adress))
                {
                    c1.AddAdress(c2Adress);
                }
            }

            foreach (var c2Coord in c2.Coords)
            {
                if (!c1.Coords.Contains(c2Coord))
                {
                    c1.AddCoord(c2Coord);
                }
            }

            foreach (var c2Coord in c2.LocalnetCoords)
            {
                if (!c1.LocalnetCoords.Contains(c2Coord))
                {
                    c1.AddLocalCoord(c2Coord);
                }
            }

            foreach (var c2ID in c2.GebäudeObjectIDs)
            {
                if (!c1.GebäudeObjectIDs.Contains(c2ID))
                {
                    c1.AddGebäudeID(c2ID);
                }
            }

            foreach (var c2ID in c2.ObjektStandorte)
            {
                if (!c1.ObjektStandorte.Contains(c2ID))
                {
                    c1.ObjektStandorte.Add(c2ID);
                }
            }

            foreach (var c2Tk in c2.TrafoKreise)
            {
                if (!c1.TrafoKreise.Contains(c2Tk))
                {
                    c1.TrafoKreise.Add(c2Tk);
                }
            }

            dbComplex.Save(c1);
            dbComplex.Delete(c2);
        }