public Debug GetTimings(string transactionId)
        {
            var transactionIdGuid = Guid.Parse(transactionId);
            var profilerDataContext = new ProfilerDbDataContext();
            var traces = profilerDataContext.GetTraceAndTimings(transactionIdGuid);

            Debug result = new Debug();

            List<Timing> allTimings = new List<Timing>();
            foreach (var trace in traces)
            {
                if (trace.IsRoot.GetValueOrDefault() == true) {
                    BuildDebugAndRoot(trace, result);
                }
                else{
                    var timing = new Timing();
                    BuildTiming(trace, timing);
                    BuildSqlTimingCount(trace, timing);
                    allTimings.Add(timing);
                }
            }

            if(allTimings.Count > 0)
                MapChildren(result.Head, allTimings);
            return result;
        }
 private static void BuildTiming(SExchange.Timing parentTiming, int timingIndex, out SExchange.Timing mTiming, out TProfiling.Timing timing)
 {
     mTiming = parentTiming.Children[timingIndex];
     timing = new TProfiling.Timing()
     {
         Order = timingIndex,
         Id = mTiming.Id.ToString(),
         KeyValues = mTiming.KeyValues.DataToXml(),
         Name = mTiming.Name,
         Level = (Contract.ProfileLevel)Enum.Parse(typeof(Contract.ProfileLevel), mTiming.Level.ToString()),
         Duration = mTiming.DurationMilliseconds.HasValue ? mTiming.DurationMilliseconds.Value : 0,
         DurationWithOutChildren = mTiming.DurationWithoutChildrenMilliseconds,
         SqlTimingDuration = mTiming.SqlTimingsDurationMilliseconds,
         ExecutedNonQueries = mTiming.ExecutedNonQueries,
         ExecutedReaders = mTiming.ExecutedReaders,
         ExecutedScalers = mTiming.ExecutedScalars,
         IsRoot = mTiming.IsRoot,
         ParentId = mTiming.ParentTimingId.HasValue ? mTiming.ParentTimingId.Value.ToString() : Guid.Empty.ToString(),
         Start = mTiming.StartMilliseconds,
         ManagedThreadId = ((mTiming.KeyValues != null) && (mTiming.KeyValues.ContainsKey("managedthreadid"))) ? int.Parse(mTiming.KeyValues["managedthreadid"]) : -1
     };
 }
 private void MapChildren(Timing parent, List<Timing> allTimings)
 {
     var children = allTimings.Where(x => parent.Id == x.ParentId);
     foreach (var child in children)
     {
         parent.Children.Add(child);
         MapChildren(child, allTimings);
     }
 }
 private void BuildTiming(spGetTraceAndTimingsResult trace, Timing timing)
 {
     timing.Id = trace.TimingId.GetValueOrDefault(Guid.Empty).ToString();
     timing.Name = trace.TimingName ?? UNKNOWN;
     timing.IsRoot = trace.IsRoot.GetValueOrDefault();
     timing.Start = trace.Start.GetValueOrDefault();
     timing.Duration = trace.Duration.GetValueOrDefault();
     timing.DurationWithOutChildren = trace.DurationWithOutChildren.GetValueOrDefault();
     timing.KeyValues = trace.KeyValues ?? UNKNOWN;
     timing.ManagedThreadId = trace.ManagedThreadId.GetValueOrDefault();
     timing.Order = trace.ProfiledOrder.GetValueOrDefault();
     timing.ParentId = trace.ParentTimingId.GetValueOrDefault(Guid.Empty).ToString();
 }
 private void BuildSqlTimingCount(spGetTraceAndTimingsResult trace, Timing timing)
 {
     var sqlDuration = trace.SqlTimingDuration.GetValueOrDefault();
     var nonQueries = trace.ExecutedNonQueries.GetValueOrDefault();
     var readers = trace.ExecutedReaders.GetValueOrDefault();
     var scalars = trace.ExecutedScalers.GetValueOrDefault();
     timing.SqlTimingsCount = nonQueries + readers + scalars;
     timing.SqlTimingDuration = sqlDuration;
     timing.ExecutedNonQueries = nonQueries;
     timing.ExecutedReaders = readers;
     timing.ExecutedScalers = scalars;
 }
        private static void InsertTimings(ProfilerDbDataContext profilerDataContext, Guid transactionId, Timing timing)
        {
            var timingId = Guid.Empty;
            Guid.TryParse(timing.Id, out timingId);
            profilerDataContext.InsertProfilerTiming(timingId, transactionId, timing.IsRoot, timing.Name, timing.KeyValues,
                    timing.Duration, timing.DurationWithOutChildren, timing.Start, Guid.Parse(timing.ParentId), timing.Order,
                    timing.SqlTimingDuration, timing.ExecutedScalers, timing.ExecutedNonQueries, timing.ExecutedReaders, timing.ManagedThreadId);

            foreach (var sqlTiming in timing.SqlTimings)
            {
                var sqlTimingId = Guid.Empty;
                Guid.TryParse(sqlTiming.Id, out sqlTimingId);
                profilerDataContext.InsertProfilerSqlTiming(sqlTiming.ExecuteType, sqlTiming.CommandString, sqlTiming.StartMilliseconds,
                    sqlTiming.DurationMilliseconds, sqlTiming.FirstFetchDurationMilliseconds, timingId, transactionId, sqlTiming.Order, sqlTimingId);
                foreach (var sqlParameter in sqlTiming.Parameters)
                {
                    profilerDataContext.InsertProfilerSqlParameter(sqlTimingId, sqlParameter.Name, sqlParameter.Value,
                        sqlParameter.DbType, sqlParameter.Size);
                }
            }

            if (timing.Children.Count > 0)
            {
                foreach (var childTiming in timing.Children)
                {
                    InsertTimings(profilerDataContext, transactionId, childTiming);
                }
            }
        }