private QueryExpression GetQuery(bool refreshOnly)
        {
            var QEplugintracelog = new QueryExpression(PluginTraceLog.EntityName);

            QEplugintracelog.ColumnSet.AddColumns(
                PluginTraceLog.CorrelationId,
                PluginTraceLog.PerformanceExecutionStarttime,
                PluginTraceLog.OperationType,
                PluginTraceLog.MessageName,
                PluginTraceLog.PrimaryKey,
                PluginTraceLog.PrimaryEntity,
                PluginTraceLog.ExceptionDetails,
                PluginTraceLog.MessageBlock,
                PluginTraceLog.PerformanceExecutionDuration,
                PluginTraceLog.CreatedOn,
                PluginTraceLog.PrimaryName,
                PluginTraceLog.Depth,
                PluginTraceLog.Mode,
                PluginTraceLog.RequestId);
            var LEstep = QEplugintracelog.AddLink(SdkMessageProcessingStep.EntityName, PluginTraceLog.PluginStepId, SdkMessageProcessingStep.PrimaryKey, JoinOperator.LeftOuter);

            LEstep.EntityAlias = "step";
            LEstep.Columns.AddColumns(SdkMessageProcessingStep.PrimaryName, SdkMessageProcessingStep.Rank, SdkMessageProcessingStep.Stage);
            filterControl.GetQueryFilter(QEplugintracelog, refreshOnly);
            QEplugintracelog.AddOrder(PluginTraceLog.PerformanceExecutionStarttime, OrderType.Descending);
            QEplugintracelog.AddOrder(PluginTraceLog.CorrelationId, OrderType.Ascending);    // This just to group threads together when starting the same second
            QEplugintracelog.AddOrder(PluginTraceLog.Depth, OrderType.Descending);           // This to try to compensate for executionstarttime only accurate to the second
            return(QEplugintracelog);
        }