public static IEnumerable<Contact> GetByTag(this IContactService service, int tagId,
                                                    Action<IQueryBuilder<Contact>> queryBuilder,
                                                    Action<IProjection<Contact>> projection)
        {
            IMethodListener listener = service.MethodListenerProvider.GetListener();

            var serviceAccessor = new InfusionSoftClient(service.Configuration)
                                  {
                                      MethodListener = listener
                                  };
            
            IDataService dataService = serviceAccessor.DataService;

            var results = new HashSet<Contact>(Contact.IdComparer);

            results.UnionWith(dataService.Query(query =>
            {
                query.Add(c => c.Groups, string.Format("{0}", tagId), ValuePosition.Default);
                queryBuilder(query);
            }, projection));

            results.UnionWith(dataService.Query(query =>
            {
                query.Add(c => c.Groups, string.Format("{0},", tagId), ValuePosition.StartsWith);
                queryBuilder(query);
            }, projection));

            results.UnionWith(dataService.Query(query =>
            {
                query.Add(c => c.Groups, string.Format(",{0},", tagId), ValuePosition.Contains);
                queryBuilder(query);
            }, projection));

            results.UnionWith(dataService.Query(query =>
            {
                query.Add(c => c.Groups, string.Format(",{0}", tagId), ValuePosition.EndsWith);
                queryBuilder(query);
            }, projection));

            return results;
        }
        public static IEnumerable <Contact> GetByTag(this IContactService service, int tagId,
                                                     Action <IQueryBuilder <Contact> > queryBuilder,
                                                     Action <IProjection <Contact> > projection)
        {
            IMethodListener listener = service.MethodListenerProvider.GetListener();

            var serviceAccessor = new InfusionSoftClient(service.Configuration)
            {
                MethodListener = listener
            };

            IDataService dataService = serviceAccessor.DataService;

            var results = new HashSet <Contact>(Contact.IdComparer);

            results.UnionWith(dataService.Query(query =>
            {
                query.Add(c => c.Groups, string.Format("{0}", tagId), ValuePosition.Default);
                queryBuilder(query);
            }, projection));

            results.UnionWith(dataService.Query(query =>
            {
                query.Add(c => c.Groups, string.Format("{0},", tagId), ValuePosition.StartsWith);
                queryBuilder(query);
            }, projection));

            results.UnionWith(dataService.Query(query =>
            {
                query.Add(c => c.Groups, string.Format(",{0},", tagId), ValuePosition.Contains);
                queryBuilder(query);
            }, projection));

            results.UnionWith(dataService.Query(query =>
            {
                query.Add(c => c.Groups, string.Format(",{0}", tagId), ValuePosition.EndsWith);
                queryBuilder(query);
            }, projection));

            return(results);
        }