public static void ExtractNewsletterUnsubscriptionsFromActivities() { if (!ModuleEntryManager.IsModuleLoaded(ModuleName.NEWSLETTER)) { return; } var activitiesQuery = new ObjectQuery(PredefinedObjectType.ACTIVITY) .Source(s => s.Join("OM_Contact", "ActivityActiveContactID", "ContactID")) .WhereEquals("ActivityType", PredefinedActivityType.NEWSLETTER_UNSUBSCRIBING) .WhereNotEmpty("ContactEmail") .Columns("ContactEmail", "ActivitySiteID", "ActivityCreated", "ActivityItemID") .Distinct(); var activities = activitiesQuery.Select(row => new { SiteID = DataHelper.GetIntValue(row, "ActivitySiteID"), ContactEmail = DataHelper.GetStringValue(row, "ContactEmail"), ActivityCreated = DataHelper.GetDateTimeValue(row, "ActivityCreated"), NewsletterID = DataHelper.GetIntValue(row, "ActivityItemID"), }); var existingUnsubscriptionsByNewsletterID = new ObjectQuery(PredefinedObjectType.NEWSLETTERUNSUBSCRIPTION) .WhereNotNull("UnsubscriptionNewsletterID") .Select(row => new { Email = DataHelper.GetStringValue(row, "UnsubscriptionEmail"), NewsletterID = DataHelper.GetIntValue(row, "UnsubscriptionNewsletterID"), }) .GroupBy(unsubscription => unsubscription.NewsletterID) .ToDictionary(group => group.Key, group => group.Select(u => u.Email).ToHashSet(StringComparer.InvariantCultureIgnoreCase)); foreach (var activity in activities) { if (existingUnsubscriptionsByNewsletterID.ContainsKey(activity.NewsletterID) && existingUnsubscriptionsByNewsletterID[activity.NewsletterID].Contains(activity.ContactEmail)) { continue; } if (!ValidationHelper.IsEmail(activity.ContactEmail)) { continue; } var unsubscriptionInfo = ModuleManager.GetObject(PredefinedObjectType.NEWSLETTERUNSUBSCRIPTION); unsubscriptionInfo.SetValue("UnsubscriptionEmail", activity.ContactEmail.ToLowerInvariant()); unsubscriptionInfo.SetValue("UnsubscriptionNewsletterID", activity.NewsletterID); unsubscriptionInfo.SetValue("UnsubscriptionSiteID", activity.SiteID); unsubscriptionInfo.SetValue("UnsubscriptionCreated", activity.ActivityCreated); unsubscriptionInfo.SetValue("UnsubscriptionGUID", Guid.NewGuid()); unsubscriptionInfo.Insert(); if (existingUnsubscriptionsByNewsletterID.ContainsKey(activity.NewsletterID)) { existingUnsubscriptionsByNewsletterID[activity.NewsletterID].Add(activity.ContactEmail); } else { existingUnsubscriptionsByNewsletterID[activity.NewsletterID] = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) { activity.ContactEmail }; } } }