예제 #1
0
    public static ChartingResponse ChartDataRequest(string Parameters, DateTime FromDate, DateTime ToDate, List <string> Units, List <string> Genders, List <string> Ages, int Site)
    {
        ChartingResponseController chartingResponseController = new ChartingResponseController();
        UserManager userManager = new UserManager();

        if (Site == -1)
        {
            Page page = new Page();
            Site = userManager.GetUserSiteId(page.User.Identity.Name);
        }

        ChartingResponse response = chartingResponseController.GetChartingResponseData(Parameters, FromDate, ToDate, Units, Genders, Ages, Site);

        return(response);
    }
예제 #2
0
        /// <summary>
        /// For getting data from the webservice.
        /// Uses dynamic Linq to create query strings. Allows for custom building.
        /// </summary>
        /// <param name="Parameter">Contains a single Question Parameter to filter by</param>
        /// <param name="FromDate">Contains the start date to filter by</param>
        /// <param name="ToDate">Contains the date to filter to</param>
        /// <param name="Units">Contains an array of units to filter by</param>
        /// <param name="Genders">Contains an array of genders to filter by</param>
        /// <param name="Ages">Contains an array of ages(ints) to filter by</param>
        /// <param name="Site">Contains the SiteId of the user generating the reports</param>
        /// <returns>ChartingResponse with gender,age,and data(value, desc, date)</returns>
        public ChartingResponse GetChartingResponseData(string Parameter, DateTime FromDate, DateTime ToDate, List <string> Units, List <string> Genders, List <string> Ages, int Site)
        {
            // Init as 1==1 so if that clause isn't used it has no effect on the query
            string paramClauseList    = "1==1";
            string unitsClauseList    = "1==1";
            string genderClauseList   = "1==1";
            string ageClauseList      = "1==1";
            string toDateClauseList   = "1==1";
            string fromDateClauseList = "1==1";
            string siteClauseList     = "1==1";

            string paramClause;

            paramClause    = $"Response.Unit.SiteId == {Site}";
            siteClauseList = paramClause;

            if (Parameter != null) //Will always be present
            {
                paramClause     = $"Question.QuestionParameter == \"{Parameter}\"";
                paramClauseList = paramClause;
            }

            if (Units != null) // No query needed for all units
            {
                List <string> unitsList = new List <string>();
                foreach (string unit in Units)
                {
                    if (unit == "All Units")
                    {
                        break;
                    }
                    unitsList.Add($"Response.Unit.UnitName == \"{unit}\"");
                }
                if (unitsList.Count() > 0)
                {
                    unitsClauseList = (unitsList.Aggregate((current, next) => current + " OR " + next)); //Builds the query strings for the dynamic Linq
                }
            }

            if (Ages != null) //recieved as a number value
            {
                List <string> ageList = new List <string>();
                foreach (string age in Ages)
                {
                    if (age == "-1")//Not specified
                    {
                        break;
                    }
                    string ageWord = "";
                    switch (age)
                    {
                    case "1":
                        ageWord = "Under 18";
                        break;

                    case "2":
                        ageWord = "18-34";
                        break;

                    case "3":
                        ageWord = "35-54";
                        break;

                    case "4":
                        ageWord = "55-74";
                        break;

                    case "5":
                        ageWord = "75+";
                        break;
                    }
                    ageList.Add($"Response.Age == \"{ageWord}\"");
                }
                if (ageList.Count() > 0)
                {
                    ageClauseList = (ageList.Aggregate((current, next) => current + " OR " + next));
                }
            }

            if (Genders != null)
            {
                List <string> genderList = new List <string>();
                foreach (string gender in Genders)
                {
                    if (gender == "-1")//Not specified
                    {
                        break;
                    }
                    genderList.Add($"Response.Gender == \"{gender}\"");
                }
                if (genderList.Count() > 0)
                {
                    genderClauseList = (genderList.Aggregate((current, next) => current + " OR " + next));
                }
            }

            if (ToDate != null & ToDate.Year != 1)
            {
                toDateClauseList = ($"Response.Date <= DateTime({ToDate.Year},{ToDate.Month},{ToDate.Day})");
            }

            if (FromDate != null & FromDate.Year != 1)
            {
                fromDateClauseList = ($"Response.Date >= DateTime({FromDate.Year},{FromDate.Month},{FromDate.Day})");
            }

            using (MSSContext context = new MSSContext())
            {
                //Have to specify each Where() clause seperatly or else the &/|| gets mixed up in the complicated filterings.
                IQueryable <DateData> result = context.QuestionResponses
                                               .Include(a => a.Answer)
                                               .Include(q => q.Question)
                                               .Include(r => r.Response)
                                               .Include(u => u.Response.Unit)
                                               .Where("Response.Unit.Disabled == false")
                                               .Where(paramClauseList)
                                               .Where(ageClauseList)
                                               .Where(unitsClauseList)
                                               .Where(genderClauseList)
                                               .Where(toDateClauseList)
                                               .Where(fromDateClauseList)
                                               .Where(siteClauseList)
                                               .Select(qr => new DateData {
                    Date = qr.Response.Date, Data = qr.Answer.Value, AnswerText = qr.Answer.Description
                });

                Question questionObj = context.Questions.Where(q => q.QuestionParameter == Parameter).FirstOrDefault();

                ChartingResponse response = new ChartingResponse
                {
                    Question  = questionObj.QuestionText,
                    Subtext   = questionObj.SubQuestionText,
                    Parameter = Parameter,
                    Gender    = Genders,
                    Age       = Ages,
                    Data      = result.ToList()
                };

                return(response);
            }
        }