public AdoQueryPayload GenerateQueryPayload(DslQueryModel dslQueryModel) { var adoQueryPayload = new AdoQueryPayload(); if (dslQueryModel.Limit.HasValue) { adoQueryPayload.AppendLine("SELECT TOP " + dslQueryModel.Limit.Value); } else { adoQueryPayload.AppendLine("SELECT"); } adoQueryPayload.AppendLine(@" ED.FingerprintText ,ED.ApplicationId ,ED.OriginExceptionType ,ED.OriginStackFrame ,ED.LowestAppStackFrame ,ED.HighestAppStackFrame ,SUM(T.Frequency) AS TotalErrors FROM Timeline T JOIN ErrorDefinition AS ED ON T.Fingerprint = ED.Fingerprint"); adoQueryPayload.Append("WHERE T.ErrorDateTime BETWEEN "); adoQueryPayload.AddFromDateParameter(dslQueryModel.DateRange.From); adoQueryPayload.Append(" AND "); adoQueryPayload.AddToDateParameter(dslQueryModel.DateRange.To); adoQueryPayload.AddNewLine(); for (int i = 0; i < dslQueryModel.MatchConditions.Count; i++) { if (i == 0) { AddLogicalOperator(adoQueryPayload, DslLogicalOperator.And); } else { AddLogicalOperator(adoQueryPayload, dslQueryModel.MatchConditions[i - 1].LogOpToNextCondition); } AddClause(dslQueryModel.MatchConditions[i], adoQueryPayload); } adoQueryPayload.AppendLine(@"GROUP BY ED.FingerprintText ,ED.ApplicationId ,ED.OriginExceptionType ,ED.OriginStackFrame ,ED.LowestAppStackFrame ,ED.HighestAppStackFrame ORDER BY TotalErrors DESC"); return(adoQueryPayload); }