public ActionResult ActivityQueries(string id)
        {
            using (var context = new MiniProfilerEntities())
            {
                var queries = context.MiniProfilerSqlTimings.Where(w => w.MiniProfilerId == new Guid(id)).OrderByDescending(o => o.DurationMilliseconds).ToList();

                var queryListToReturn = new List<ActivityQueryDto>();
                foreach (var query in queries)
                {
                    var queryParameters = context.MiniProfilerSqlTimingParameters.Where(w => w.ParentSqlTimingId == query.Id).ToList();

                    foreach(var param in queryParameters)
                    {
                        if (!param.Name.Contains("linq"))
                        {
                            if (param.DbType == "String" || param.DbType == "DateTime2" || param.DbType == "DateTime")
                            {
                                query.CommandString = query.CommandString.Replace(param.Name, "\'" + param.Value + "\'");
                            }
                            else
                            {
                                query.CommandString = query.CommandString.Replace(param.Name, param.Value);
                            }
                        }
                        else
                        {
                            if (param.DbType == "String" || param.DbType == "DateTime2" || param.DbType == "DateTime")
                            {
                                query.CommandString = query.CommandString.Replace("@" + param.Name, "\'" + param.Value + "\'");
                            }
                            else
                            {
                                query.CommandString = query.CommandString.Replace("@" + param.Name, param.Value);
                            }
                        }
                    }

                    queryListToReturn.Add(new ActivityQueryDto()
                                                            {
                                                                Command = query.CommandString,
                                                                Duration = query.DurationMilliseconds,
                                                                Id = query.Id.ToString()
                                                            }
                                            );
                }

                return View(queryListToReturn);
            }
        }
        //
        // GET: /HealthMonitor/BoxAndWhisker
        public ActionResult BoxAndWhisker(BoxAndWhiskerSearchCriteria boxAndWhiskerSearchCriteria, int pageNumber = 1, int pageSize = 10, bool hasSearchBeenPerformed = false)
        {
            using (var context = new MiniProfilerEntities())
            {
                if(!hasSearchBeenPerformed)
                {
                    boxAndWhiskerSearchCriteria = new BoxAndWhiskerSearchCriteria
                    {
                        BeginDate = new DateTime(DateTime.Now.Year, 1, 1),
                        EndDate = new DateTime(DateTime.Now.Year, 12, 31),
                    };
                }

                ViewBag.BoxAndWhiskerSearchCriteria = boxAndWhiskerSearchCriteria;
                ViewBag.PageNumber = pageNumber;
                ViewBag.PageSize = pageSize;

                var results = context.Database.SqlQuery<BoxAndWhiskerDto>(@"
                    SELECT Quartile1.Name, FirstQuartileMinimum, SecondQuartileMinimum, (SecondQuartileMaximum + thirdQuartileMinimum) / 2 AS Median, ThirdQuartileMaximum, FourthQuartileMaximum, AverageDuration
                    FROM
                    (
                        SELECT MAX(Quartile1Inner.Name) as Name, MIN(Quartile1Inner.DurationMilliseconds) as FirstQuartileMinimum
                        FROM
                        (
                            SELECT Name, DurationMilliseconds, NTILE(4) OVER(PARTITION BY Name ORDER BY DurationMilliseconds) as Quartile
                            FROM MiniProfilers with (nolock)
                            WHERE
                                Name != '/'
                                AND [Started] > @beginDate
                                AND [Started] < @endDate
                        ) AS Quartile1Inner
                        WHERE Quartile = 1
                        GROUP BY Name
                    ) AS Quartile1
                    JOIN
                    (
                        SELECT MAX(Quartile2Inner.Name) as Name, MIN(Quartile2Inner.DurationMilliseconds) as SecondQuartileMinimum, MAX(Quartile2Inner.DurationMilliseconds) as SecondQuartileMaximum
                        FROM
                        (
                            SELECT Name, DurationMilliseconds, NTILE(4) OVER(PARTITION BY Name ORDER BY DurationMilliseconds) as Quartile
                            FROM MiniProfilers with (nolock)
                            WHERE
                                Name != '/'
                                AND [Started] > @beginDate
                                AND [Started] < @endDate
                        ) AS Quartile2Inner
                        WHERE Quartile = 2
                        GROUP BY Name
                    ) AS Quartile2
                    ON Quartile1.Name = Quartile2.Name
                    JOIN
                    (
                        SELECT MAX(Quartile3Inner.Name) as Name, MAX(Quartile3Inner.DurationMilliseconds) as ThirdQuartileMaximum, MIN(Quartile3Inner.DurationMilliseconds) as ThirdQuartileMinimum
                        FROM
                        (
                            SELECT Name, DurationMilliseconds, NTILE(4) OVER(PARTITION BY Name ORDER BY DurationMilliseconds) as Quartile
                            FROM MiniProfilers with (nolock)
                            WHERE
                                Name != '/'
                                AND [Started] > @beginDate
                                AND [Started] < @endDate
                        ) AS Quartile3Inner
                        WHERE Quartile = 3
                        GROUP BY Name
                    ) AS Quartile3
                    ON Quartile2.Name = Quartile3.Name
                    JOIN
                    (
                        SELECT MAX(Quartile4Inner.Name) as Name, MAX(Quartile4Inner.DurationMilliseconds) as FourthQuartileMaximum
                        FROM
                        (
                            SELECT Name, DurationMilliseconds, NTILE(4) OVER(PARTITION BY Name ORDER BY DurationMilliseconds) as Quartile
                            FROM MiniProfilers with (nolock)
                            WHERE
                                Name != '/'
                                AND [Started] > @beginDate
                                AND [Started] < @endDate
                        ) AS Quartile4Inner
                        WHERE Quartile = 4
                        GROUP BY Name
                    ) AS Quartile4
                    ON Quartile3.Name = Quartile4.Name
                    JOIN
                    (
                        SELECT Name, AVG(DurationMilliseconds) as AverageDuration
                        FROM MiniProfilers with (nolock)
                        WHERE
                            Name != '/'
                            AND [Started] > @beginDate
                            AND [Started] < @endDate
                        GROUP BY Name
                    ) AS AverageDuration
                    ON Quartile4.Name = AverageDuration.Name
                    ORDER BY FourthQuartileMaximum desc
                    OFFSET (@pageNumber-1)*@pageSize ROWS
                    FETCH NEXT @pageSize ROWS ONLY",
                    new SqlParameter("beginDate", boxAndWhiskerSearchCriteria.BeginDate.ToString()),
                    new SqlParameter("endDate",boxAndWhiskerSearchCriteria.EndDate.ToString()),
                    new SqlParameter("pageSize", pageSize),
                    new SqlParameter("pageNumber", pageNumber)
                ).ToList();

                //Get Total Item Count
                ViewBag.TotalItems = context.Database.SqlQuery<int>(@"
                    SELECT COUNT(1)
                    FROM
                    (
                        SELECT MAX(Quartile1Inner.Name) as Name, MIN(Quartile1Inner.DurationMilliseconds) as FirstQuartileMinimum
                        FROM
                        (
                            SELECT Name, DurationMilliseconds, NTILE(4) OVER(PARTITION BY Name ORDER BY DurationMilliseconds) as Quartile
                            FROM MiniProfilers with (nolock)
                            WHERE
                                Name != '/'
                                AND [Started] > @beginDate
                                AND [Started] < @endDate
                        ) AS Quartile1Inner
                        WHERE Quartile = 1
                        GROUP BY Name
                    ) AS Quartile1
                    JOIN
                    (
                        SELECT MAX(Quartile2Inner.Name) as Name, MIN(Quartile2Inner.DurationMilliseconds) as SecondQuartileMinimum, MAX(Quartile2Inner.DurationMilliseconds) as SecondQuartileMaximum
                        FROM
                        (
                            SELECT Name, DurationMilliseconds, NTILE(4) OVER(PARTITION BY Name ORDER BY DurationMilliseconds) as Quartile
                            FROM MiniProfilers with (nolock)
                            WHERE
                                Name != '/'
                                AND [Started] > @beginDate
                                AND [Started] < @endDate
                        ) AS Quartile2Inner
                        WHERE Quartile = 2
                        GROUP BY Name
                    ) AS Quartile2
                    ON Quartile1.Name = Quartile2.Name
                    JOIN
                    (
                        SELECT MAX(Quartile3Inner.Name) as Name, MAX(Quartile3Inner.DurationMilliseconds) as ThirdQuartileMaximum, MIN(Quartile3Inner.DurationMilliseconds) as ThirdQuartileMinimum
                        FROM
                        (
                            SELECT Name, DurationMilliseconds, NTILE(4) OVER(PARTITION BY Name ORDER BY DurationMilliseconds) as Quartile
                            FROM MiniProfilers with (nolock)
                            WHERE
                                Name != '/'
                                AND [Started] > @beginDate
                                AND [Started] < @endDate
                        ) AS Quartile3Inner
                        WHERE Quartile = 3
                        GROUP BY Name
                    ) AS Quartile3
                    ON Quartile2.Name = Quartile3.Name
                    JOIN
                    (
                        SELECT MAX(Quartile4Inner.Name) as Name, MAX(Quartile4Inner.DurationMilliseconds) as FourthQuartileMaximum
                        FROM
                        (
                            SELECT Name, DurationMilliseconds, NTILE(4) OVER(PARTITION BY Name ORDER BY DurationMilliseconds) as Quartile
                            FROM MiniProfilers with (nolock)
                            WHERE
                                Name != '/'
                                AND [Started] > @beginDate
                                AND [Started] < @endDate
                        ) AS Quartile4Inner
                        WHERE Quartile = 4
                        GROUP BY Name
                    ) AS Quartile4
                    ON Quartile3.Name = Quartile4.Name
                    JOIN
                    (
                        SELECT Name, AVG(DurationMilliseconds) as AverageDuration
                        FROM MiniProfilers with (nolock)
                        WHERE
                            Name != '/'
                            AND [Started] > @beginDate
                            AND [Started] < @endDate
                        GROUP BY Name
                    ) AS AverageDuration
                    ON Quartile4.Name = AverageDuration.Name",
                    new SqlParameter("beginDate", boxAndWhiskerSearchCriteria.BeginDate.ToString()),
                    new SqlParameter("endDate", boxAndWhiskerSearchCriteria.EndDate.ToString())
                ).First();

                return View(results);
            }
        }
        public ActionResult RouteUseFrequency(RouteUseFrequencySearchCriteria routeUseFrequencySearchCriteria, int pageNumber = 1, int pageSize = 10, bool hasSearchBeenPerformed = false)
        {
            ViewBag.PageNumber = pageNumber;
            ViewBag.PageSize = pageSize;

            if (!hasSearchBeenPerformed)
            {
                routeUseFrequencySearchCriteria = new RouteUseFrequencySearchCriteria
                {
                    BeginDate = new DateTime(DateTime.Now.Year, 1, 1),
                    EndDate = new DateTime(DateTime.Now.Year, 12, 31),
                };
            }

            ViewBag.RouteUseFrequencySearchCriteria = routeUseFrequencySearchCriteria;

            using (var context = new MiniProfilerEntities())
            {
                using (var t = new TransactionScope(TransactionScopeOption.Required,
                                                    new TransactionOptions
                                                    {
                                                        IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
                                                    }))
                {
                    var results = (from miniProfiler in context.MiniProfilers
                                   where miniProfiler.Name != "/"
                                   where miniProfiler.Started > routeUseFrequencySearchCriteria.BeginDate
                                   where miniProfiler.Started < routeUseFrequencySearchCriteria.EndDate
                                   group miniProfiler by miniProfiler.Name into groupedMiniProfiler
                                   orderby groupedMiniProfiler.Count() descending
                                   select new RouteFrequencyDto
                                   {
                                       Name = groupedMiniProfiler.Key,
                                       FrequencyCount = groupedMiniProfiler.Count()
                                   })
                                  .Skip((pageNumber - 1) * pageSize)
                                  .Take(pageSize)
                                  .ToList();

                    ViewBag.TotalItems = (from miniProfiler in context.MiniProfilers
                                          where miniProfiler.Name != "/"
                                          where miniProfiler.Started > routeUseFrequencySearchCriteria.BeginDate
                                          where miniProfiler.Started < routeUseFrequencySearchCriteria.EndDate
                                          group miniProfiler by miniProfiler.Name into groupedMiniProfiler
                                          orderby groupedMiniProfiler.Count() descending
                                          select new RouteFrequencyDto
                                          {
                                              Name = groupedMiniProfiler.Key,
                                              FrequencyCount = groupedMiniProfiler.Count()
                                          })
                                          .Count();

                    return View(results);
                }
            }
        }
        public ActionResult ListActivity(int pageNumber = 1, int pageSize = 10)
        {
            ViewBag.PageNumber = pageNumber;
            ViewBag.PageSize = pageSize;

            using (var context = new MiniProfilerEntities())
            {
                using (var t = new TransactionScope(TransactionScopeOption.Required,
                                    new TransactionOptions
                                    {
                                        IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
                                    }))
                {
                    var queryResults = context.MiniProfilers
                                                .Where(w => w.Name != "/")
                                                .OrderByDescending(o => o.Started)
                                                .Skip((pageNumber - 1) * pageSize)
                                                .Take(pageSize)
                                                .Select(s => new
                                                {
                                                    Id = s.Id,
                                                    Name = s.Name,
                                                    BeginTime = s.Started,
                                                    Duration = s.DurationMilliseconds
                                                })
                                                .ToList();

                    var returnResults = queryResults.Select(s => new ActivityDto()
                                                                    {
                                                                        Id = s.Id.ToString(),
                                                                        BeginTime = s.BeginTime,
                                                                        Duration = s.Duration,
                                                                        Name = s.Name
                                                                    }).ToList();

                    ViewBag.TotalItems = context.MiniProfilers
                                                .Where(w => w.Name != "/")
                                                .OrderByDescending(o => o.Started)
                                                .Select(s => new
                                                {
                                                    Id = s.Id,
                                                    Name = s.Name,
                                                    BeginTime = s.Started,
                                                    Duration = s.DurationMilliseconds
                                                }).Count();

                    return View(returnResults);
                }
            }
        }