public void UpdateTrackingDomains(IEnumerable<string> hostNames, IOenRepository repository) { if (!domaingroup_id.HasValue) { throw new Exception("No Domain Group assigned"); } var trackingDomains = (from td in repository.Retrieve<TrackingDomain>().Where(t => t.DeliveryGroupId == deliveryGroup_id) join d in repository.GetDomains() on td.DomainId equals d.domain_id select new { TrackingDomain = td, Domain = d }).ToList(); trackingDomains.ForEach(t => { t.TrackingDomain.Enabled = hostNames.Any(vt => vt.ToLower() == t.Domain.host.ToLower()); }); var existingHostNames = trackingDomains.Where(t => t.Domain != null).Select(t => t.Domain.host.ToLower()).Distinct(); var trackingDomainsToInsert = hostNames.Where(t => !existingHostNames.Contains(t.ToLower())).ToList(); // Once for validation so none are created unless all are valid trackingDomainsToInsert.ForEach(t => { var domain = repository.GetDomains().FirstOrDefault(d => d.host == t && d.domainGroup_id != domaingroup_id); if (domain != null) { throw new Exception("Tracking Domain in use by a different group"); } }); trackingDomainsToInsert.ForEach(t => { var domain = repository.GetDomains().FirstOrDefault(d => d.host == t); if (domain == null) { domain = repository.AddDomain(new Domain { host = t, domainGroup_id = domaingroup_id, enabled = true }); repository.SaveChanges(); } repository.AddTrackingDomain(new TrackingDomain() { Enabled = true, DeliveryGroupId = deliveryGroup_id, DomainId = domain.domain_id }); }); }