public virtual SyncResult Synchronize()
        {
            var result = new SyncResult();

            // Get all the queued records for subscription/unsubscription
            var allRecords = _subscriptionEventQueueingService.GetAll();
            //get unique and latest records
            var allRecordsUnique = new List<MailChimpEventQueueRecord>();
            foreach (var item in allRecords.OrderByDescending(x => x.CreatedOnUtc))
            {
                var exists = allRecordsUnique.FirstOrDefault(x => x.Email.Equals(item.Email, StringComparison.InvariantCultureIgnoreCase)) != null;
                if (!exists)
                    allRecordsUnique.Add(item);
            }
            var subscribeRecords = allRecordsUnique.Where(x => x.IsSubscribe).ToList();
            var unsubscribeRecords = allRecordsUnique.Where(x => !x.IsSubscribe).ToList();

            //subscribe
            if (subscribeRecords.Any())
            {
                BatchSubscribeResult subscribeResult = BatchSubscribe(subscribeRecords);
                if (subscribeResult.AddCount > 0)
                {
                    result.SubscribeResult = string.Format("Added {0} new records", subscribeResult.AddCount);
                }
                if(subscribeResult.UpdateCount>0){
                    result.SubscribeResult = string.Format("Updated {0} new records", subscribeResult.UpdateCount);
                }
            }
            else
            {
                result.SubscribeResult = "No records to add";
            }

            //unsubscribe
            if (unsubscribeRecords.Any())
            {
                var unsubscribeResultCount = BatchUnsubscribe(unsubscribeRecords);
                if (unsubscribeResultCount.SuccessCount > 0)
                {
                    result.UnsubscribeResult = string.Format("Unsubscribe {0} complete ", unsubscribeResultCount);
                }
            }
            else
            {
                result.UnsubscribeResult = "No records to unsubscribe";
            }

            //delete the queued records
            foreach (var sub in allRecords)
            {
                _subscriptionEventQueueingService.Delete(sub);
            }

            return result;
        }
        public virtual SyncResult Synchronize()
        {
            var result = new SyncResult();

            // Get all the queued records for subscription/unsubscription
            var allRecords = _subscriptionEventQueueingService.GetAll();
            //get unique and latest records
            var allRecordsUnique = new List<MailChimpEventQueueRecord>();
            foreach (var item in allRecords
                .OrderByDescending(x => x.CreatedOnUtc))
            {
                var exists = allRecordsUnique
                    .Where(x => x.Email.Equals(item.Email, StringComparison.InvariantCultureIgnoreCase))
                    .FirstOrDefault() != null;
                if (!exists)
                    allRecordsUnique.Add(item);
            }
            var subscribeRecords = allRecordsUnique.Where(x => x.IsSubscribe).ToList();
            var unsubscribeRecords = allRecordsUnique.Where(x => !x.IsSubscribe).ToList();

            //subscribe
            if (subscribeRecords.Count > 0)
            {
                var subscribeResult = BatchSubscribe(subscribeRecords);
                //result
                if (subscribeResult.api_ErrorMessages.Count > 0)
                {
                    foreach (var error in subscribeResult.api_ErrorMessages)
                        result.SubscribeErrors.Add(error.error);
                }
                else
                {
                    result.SubscribeResult = subscribeResult.ToString();
                }
            }
            else
            {
                result.SubscribeResult = "No records to add";
            }
            //unsubscribe
            if (unsubscribeRecords.Count > 0)
            {
                var unsubscribeResult = BatchUnsubscribe(unsubscribeRecords);
                //result
                if (unsubscribeResult.api_ErrorMessages.Count > 0)
                {
                    foreach (var error in unsubscribeResult.api_ErrorMessages)
                        result.UnsubscribeErrors.Add(error.error);
                }
                else
                {
                    result.UnsubscribeResult = unsubscribeResult.ToString();
                }
            }
            else
            {
                result.UnsubscribeResult = "No records to unsubscribe";
            }

            //delete the queued records
            foreach (var sub in allRecords)
                _subscriptionEventQueueingService.Delete(sub);

            //other useful properties of listBatchSubscribeOutput and listBatchUnsubscribeOutput
            //output.result.add_count
            //output.result.error_count
            //output.result.update_count
            //output.result.errors
            //output.api_Request, output.api_Response, // raw data
            //output.api_ErrorMessages, output.api_ValidatorMessages); // & errors
            return result;
        }
        public virtual SyncResult Synchronize()
        {
            var result = new SyncResult();

            // Get all the queued records for subscription/unsubscription
            var allRecords = _subscriptionEventQueueingService.GetAll();
            //get unique and latest records
            var allRecordsUnique = new List <MailChimpEventQueueRecord>();

            foreach (var item in allRecords
                     .OrderByDescending(x => x.CreatedOnUtc))
            {
                var exists = allRecordsUnique
                             .Where(x => x.Email.Equals(item.Email, StringComparison.InvariantCultureIgnoreCase))
                             .FirstOrDefault() != null;
                if (!exists)
                {
                    allRecordsUnique.Add(item);
                }
            }
            var subscribeRecords   = allRecordsUnique.Where(x => x.IsSubscribe).ToList();
            var unsubscribeRecords = allRecordsUnique.Where(x => !x.IsSubscribe).ToList();

            //subscribe
            if (subscribeRecords.Count > 0)
            {
                var subscribeResult = BatchSubscribe(subscribeRecords);
                //result
                if (subscribeResult.api_ErrorMessages.Count > 0)
                {
                    foreach (var error in subscribeResult.api_ErrorMessages)
                    {
                        result.SubscribeErrors.Add(error.error);
                    }
                }
                else
                {
                    result.SubscribeResult = subscribeResult.ToString();
                }
            }
            else
            {
                result.SubscribeResult = "No records to add";
            }
            //unsubscribe
            if (unsubscribeRecords.Count > 0)
            {
                var unsubscribeResult = BatchUnsubscribe(unsubscribeRecords);
                //result
                if (unsubscribeResult.api_ErrorMessages.Count > 0)
                {
                    foreach (var error in unsubscribeResult.api_ErrorMessages)
                    {
                        result.UnsubscribeErrors.Add(error.error);
                    }
                }
                else
                {
                    result.UnsubscribeResult = unsubscribeResult.ToString();
                }
            }
            else
            {
                result.UnsubscribeResult = "No records to unsubscribe";
            }

            //delete the queued records
            foreach (var sub in allRecords)
            {
                _subscriptionEventQueueingService.Delete(sub);
            }

            //other useful properties of listBatchSubscribeOutput and listBatchUnsubscribeOutput
            //output.result.add_count
            //output.result.error_count
            //output.result.update_count
            //output.result.errors
            //output.api_Request, output.api_Response, // raw data
            //output.api_ErrorMessages, output.api_ValidatorMessages); // & errors
            return(result);
        }