public PagedList<Subscriber> GetMembers(Segment segment, SubscribeType status = SubscribeType.Subscribed, int page = 1, int pageSize = 500)
 {
     return GetMembers(segment.MailingListID, segment.ID, status, page, pageSize);
 }
        public void Save(Segment segment)
        {
            // do some validation
            foreach (SegmentCriteria criteria in segment.Criteria)
            {
                if (criteria.SegmentID != segment.ID && criteria.SegmentID != 0)
                {
                    throw new InvalidOperationException("Cannot save criteria that belong to another segment");
                }
            }

            if (segment.ID == 0)
            {
                // we are inserting a new segment
                segment.ID = Create(segment.MailingListID, segment.Name, segment.MatchType);

                // inserting criteria for the new segment as well
                foreach (SegmentCriteria criteria in segment.Criteria)
                {
                    String field = criteria.Field.ToString();
                    if (criteria.Field == SegmentCriteriaField.CustomField) field = criteria.CustomFieldID.Value.ToString();
                    AddCriteria(segment.MailingListID, segment.ID, field, criteria.Comparer, criteria.Value, criteria.DateFrom, criteria.DateTo);
                }
            }
            else
            {
                // or we are updating an existing segment
                Update(segment);

                // updating criteria for the existing segment as well
                // we will load the existing segment from the database to compare it with our modified segment
                Segment existing = FindByID(segment.MailingListID, segment.ID);

                List<int> existingCriteriaIDs = existing.Criteria.Select(x => x.ID).ToList();
                List<int> segmentCriteriaIDs = segment.Criteria.Where(x => x.ID != 0).Select(x => x.ID).ToList();

                // find with criteria where deleted
                foreach (int idToDelete in existingCriteriaIDs.Where(id => !segmentCriteriaIDs.Contains(id)))
                {
                    RemoveCriteria(segment.MailingListID, segment.ID, idToDelete);
                }

                // find which criteria where modified
                foreach (int idToUpdate in segmentCriteriaIDs.Where(id => existingCriteriaIDs.Contains(id)))
                {
                    SegmentCriteria criteria = segment.Criteria.Single(c => c.ID == idToUpdate);
                    UpdateCriteria(segment.MailingListID, segment.ID, criteria);
                }

                // find which criteria where added
                foreach (SegmentCriteria criteria in segment.Criteria.Where(x => x.ID == 0))
                {
                    String field = criteria.Field.ToString();
                    if (criteria.Field == SegmentCriteriaField.CustomField) field = criteria.CustomFieldID.Value.ToString();
                    AddCriteria(segment.MailingListID, segment.ID, field, criteria.Comparer, criteria.Value, criteria.DateFrom, criteria.DateTo);
                }
            }

            // reload segment to populate the object with all properties
            Segment reloaded = FindByID(segment.MailingListID, segment.ID);
            Utilities.CopyProperties<Segment>(reloaded, segment);
        }
 private void Update(Segment segment)
 {
     _Manager.MakeRequest(HttpMethod.POST, String.Format("/lists/{0}/segments/{1}/update", segment.MailingListID, segment.ID), new
     {
         Name = segment.Name,
         MatchType = segment.MatchType
     });
 }