private void syncProductGroupMapping(List <MasterGroupMapping> listOfSourceProductGroupMappings, int?sourceParentProductGroupMappingID, int?destParentProductGroupMappingID, Connector destConnector) { List <MasterGroupMapping> listOfSourceProductGroupMappingsByParentID = new List <MasterGroupMapping>(); List <MasterGroupMapping> listOfDestProductGroupMappingsByParentID = new List <MasterGroupMapping>(); if (sourceParentProductGroupMappingID.HasValue && sourceParentProductGroupMappingID.Value > 0) { listOfSourceProductGroupMappingsByParentID = listOfSourceProductGroupMappings .Where(x => x.ParentMasterGroupMappingID == sourceParentProductGroupMappingID.Value) .ToList(); listOfDestProductGroupMappingsByParentID = masterGroupMappingRepo .GetListOfProductGroupsByConnector(destConnector.ConnectorID) .Where(x => x.SourceProductGroupMappingID != null && x.ParentMasterGroupMappingID == destParentProductGroupMappingID) .ToList(); } else { listOfSourceProductGroupMappingsByParentID = listOfSourceProductGroupMappings .Where(x => x.ParentMasterGroupMappingID == null) .ToList(); listOfDestProductGroupMappingsByParentID = masterGroupMappingRepo .GetListOfProductGroupsByConnector(destConnector.ConnectorID) .Where(x => x.ParentMasterGroupMappingID == null && x.SourceProductGroupMappingID != null) .ToList(); } List <MasterGroupMapping> listOfProductGroupMappingsToInsert = ( from parentPGM in listOfSourceProductGroupMappingsByParentID join childPGM in listOfDestProductGroupMappingsByParentID on parentPGM.MasterGroupMappingID equals childPGM.SourceProductGroupMappingID into mappedPGM from pgm in mappedPGM.DefaultIfEmpty() where pgm == null select parentPGM ).ToList(); List <MasterGroupMapping> listOfProductGroupMappingsToUpdate = ( from parentPGM in listOfSourceProductGroupMappingsByParentID join childPGM in listOfDestProductGroupMappingsByParentID on parentPGM.MasterGroupMappingID equals childPGM.SourceProductGroupMappingID where parentPGM.Score != childPGM.Score || parentPGM.FlattenHierarchy != childPGM.FlattenHierarchy || parentPGM.FilterByParentGroup != childPGM.FilterByParentGroup || parentPGM.ExportID != childPGM.ExportID select childPGM ).ToList(); List <MasterGroupMapping> listOfProductGroupMappingsToDelete = ( from childPGM in listOfDestProductGroupMappingsByParentID join parentPGM in listOfSourceProductGroupMappingsByParentID on childPGM.SourceProductGroupMappingID equals parentPGM.MasterGroupMappingID into mappedPGM from pgm in mappedPGM.DefaultIfEmpty() where pgm == null select childPGM ).ToList(); if (listOfProductGroupMappingsToInsert.Count > 0) { InsertProductGroupMappingToDestConnector(listOfProductGroupMappingsToInsert, destConnector, (destParentProductGroupMappingID.HasValue && destParentProductGroupMappingID.Value > 0) ? destParentProductGroupMappingID : null); } if (listOfProductGroupMappingsToUpdate.Count > 0) { UpdateProductGroupMappingInDestConnector(listOfProductGroupMappingsToUpdate, listOfSourceProductGroupMappingsByParentID); } if (listOfProductGroupMappingsToDelete.Count > 0) { DeleteProductGroupMappingFromDestConnector(listOfProductGroupMappingsToDelete); } if (listOfProductGroupMappingsToInsert.Count + listOfProductGroupMappingsToDelete.Count > 0) { if (sourceParentProductGroupMappingID.HasValue && sourceParentProductGroupMappingID.Value > 0) { listOfDestProductGroupMappingsByParentID = masterGroupMappingRepo .GetListOfProductGroupsByConnector(destConnector.ConnectorID) .Where(x => x.SourceProductGroupMappingID != null && x.ParentMasterGroupMappingID == destParentProductGroupMappingID) .ToList(); } else { listOfDestProductGroupMappingsByParentID = masterGroupMappingRepo .GetListOfProductGroupsByConnector(destConnector.ConnectorID) .Where(x => x.ParentMasterGroupMappingID == null && x.SourceProductGroupMappingID != null) .ToList(); } } listOfSourceProductGroupMappingsByParentID.ForEach(productGroupMapping => { if (!productGroupMapping.ParentMasterGroupMappingID.HasValue) { string productGroupMappingName = masterGroupMappingRepo.GetListOfMasterGroupMappingLanguagesByMasterGroupMappingID(productGroupMapping.MasterGroupMappingID).Where(x => x.LanguageID == 2).Select(x => x.Name).FirstOrDefault(); log.DebugFormat("Sync Product Group Mapping {0}({1})", productGroupMappingName, productGroupMapping.MasterGroupMappingID); } int countProductGroupMappingChildren = listOfSourceProductGroupMappings .Where(x => x.ParentMasterGroupMappingID == productGroupMapping.MasterGroupMappingID) .Count(); if (countProductGroupMappingChildren > 0) { MasterGroupMapping childProductGroupMapping = listOfDestProductGroupMappingsByParentID.Single(x => x.SourceProductGroupMappingID == productGroupMapping.MasterGroupMappingID); if (childProductGroupMapping != null) { syncProductGroupMapping(listOfSourceProductGroupMappings, productGroupMapping.MasterGroupMappingID, childProductGroupMapping.MasterGroupMappingID, destConnector); } else { log.DebugFormat("ProductGroupMapping with SourceProductGroupMappingID {0} in Connector {1} should exist! But i cant find it.", productGroupMapping.MasterGroupMappingID, destConnector); } } }); }