private static Plan MapPlan(IDataReader reader)
        {
            Plan p = new Plan();

            PlanType pt = new PlanType();

            int startingIndex = 0;

            p.Id = reader.GetSafeInt32(startingIndex++);
            p.Name = reader.GetSafeString(startingIndex++);
            p.Description = reader.GetSafeString(startingIndex++);
            p.Cost = reader.GetSafeInt32(startingIndex++);
            p.GoLiveDate = reader.GetSafeDateTime(startingIndex++);
            p.DateAdded = reader.GetSafeDateTime(startingIndex++);
            p.DateModified = reader.GetSafeDateTime(startingIndex++);
            p.LanguageCode = reader.GetSafeString(startingIndex++);
            p.Tag = reader.GetSafeString(startingIndex++);

            int secondIndex = 9;
            pt.Name = reader.GetSafeString(secondIndex++);
            pt.Id = reader.GetSafeInt32(secondIndex++);

            p.Type = pt;

            return p;
        }
        public List<UserPlans> GetPlanByUserId(string userId)
        {
            List<UserPlans> list = null;
            List<PlanFeature> featureList = null;

            DataProvider.ExecuteCmd(GetConnection, "dbo.UserPlans_SelectByUserId_v3"
               , inputParamMapper: delegate(SqlParameterCollection paramCollection)

               { paramCollection.AddWithValue("@UserId", userId); }

               , map: delegate(IDataReader reader, short set)
               {

                   UserPlans u = new UserPlans();

                   PlanType pt = new PlanType();

                   PlanFeature pf = new PlanFeature();

                   PriorityLevel pl = new PriorityLevel();

                   if (set == 0)
                   {
                       int startingIndex = 0;

                       u.PlanId = reader.GetSafeInt32(startingIndex++);
                       u.Subscribed = reader.GetSafeBool(startingIndex++);
                       u.PlanName = reader.GetSafeString(startingIndex++);
                       u.PlanDescription = reader.GetSafeString(startingIndex++);
                       pt.Id = reader.GetSafeInt32(startingIndex++);
                       pt.Name = reader.GetSafeString(startingIndex++);
                       u.Cost = reader.GetSafeInt32(startingIndex++);
                       u.GoLiveDate = reader.GetSafeDateTime(startingIndex++);
                       u.TagId = reader.GetSafeInt32(startingIndex++);
                       u.TagName = reader.GetSafeString(startingIndex++);

                       u.Type = pt;

                       if (list == null)
                       {
                           list = new List<UserPlans>();
                       }

                       list.Add(u);

                   }

                   if (set == 1)
                   {
                       int startingIndex = 0;

                       pf.Title = reader.GetSafeString(startingIndex++);
                       pf.Description = reader.GetSafeString(startingIndex++);
                       pf.Id = reader.GetSafeInt32(startingIndex++);
                       pf.PlanId = reader.GetSafeInt32(startingIndex++);
                       pf.DateAdded = reader.GetSafeDateTime(startingIndex++);
                       pf.DateModified = reader.GetSafeDateTime(startingIndex++);
                       pf.LanguageCode = reader.GetSafeString(startingIndex++);

                       pl.Name = reader.GetSafeString(startingIndex++);
                       pl.Id = reader.GetSafeInt32(startingIndex++);

                       pf.SortOrder = pl;

                       if (featureList == null)
                       {
                           featureList = new List<PlanFeature>();
                       }

                       featureList.Add(pf);

                   }

               });

            if (featureList != null)
            {
            for (var i = 0; featureList.Count > i; i++)
            {

                for (var e = 0; list.Count > e; e++)
                {
                    if (list[e].PlanId == featureList[i].PlanId)
                    {

                        if (list[e].FeatureInfo == null)
                        {
                            list[e].FeatureInfo = new List<PlanFeature>();
                        }

                        list[e].FeatureInfo.Add(featureList[i]);

                    }
                }

            }
            }

            return list;
        }
        public PlanType GetPlanTypesById(int typeId)
        {
            PlanType pt = null;

            DataProvider.ExecuteCmd(GetConnection, "dbo.PlanTypes_SelectById"
               , inputParamMapper: delegate(SqlParameterCollection paramCollection)
               {
                   paramCollection.AddWithValue("@Id", typeId);
               }
               , map: delegate(IDataReader reader, short set)
               {
                   pt = new PlanType();

                   int startingIndex = 0;

                   pt.Id = reader.GetSafeInt32(startingIndex++);
                   pt.Name = reader.GetSafeString(startingIndex++);

               }
               );
            return pt;
        }
        public List<PlanType> GetAllPlanTypes()
        {
            List<PlanType> list = null;

            DataProvider.ExecuteCmd(GetConnection, "dbo.PlanTypes_Select"
               , inputParamMapper: null
               , map: delegate(IDataReader reader, short set)
               {
                   PlanType pt = new PlanType();

                   int startingIndex = 0;

                   pt.Id = reader.GetSafeInt32(startingIndex++);
                   pt.Name = reader.GetSafeString(startingIndex++);

                   if (list == null)
                   {
                       list = new List<PlanType>();
                   }

                   list.Add(pt);
               }
               );
            return list;
        }