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); }