public virtual CommandDefinition ToCountStatement(CountStatement statement, CommandFlags flags) { var sql = new StringBuilder("SELECT COUNT("); if (statement.IsDistinct) { sql.Append(" DISTINCT "); } sql.Append(statement.Columns.Count == 1 ? statement.Columns[0] : "*"); sql.Append(")\n FROM "); sql.Append(statement.TableName); if (statement.WhereExpression.Length > 0) { sql.Append("\n WHERE "); sql.Append(statement.WhereExpression); } if (statement.GroupByExpression.Length > 0) { sql.Append("\n GROUP BY "); sql.Append(statement.GroupByExpression); } if (statement.HavingExpression.Length > 0) { sql.Append("\n HAVING "); sql.Append(statement.HavingExpression); } return(new CommandDefinition(sql.ToString(), statement.Parameters, flags: flags)); }
private void AddResultOperator(ResultOperatorBase resultOperator, IFieldMapping fields) { switch (resultOperator) { case ISelectableOperator selectable: CurrentStatement = selectable.ModifyStatement(CurrentStatement, _session); break; case TakeResultOperator take: CurrentStatement.Limit = (int)take.Count.Value(); break; case SkipResultOperator skip: CurrentStatement.Offset = (int)skip.Count.Value(); break; case AnyResultOperator _: CurrentStatement.ToAny(); break; case CountResultOperator _: if (CurrentStatement.IsDistinct) { CurrentStatement.ConvertToCommonTableExpression(_session); CurrentStatement = new CountStatement <int>(CurrentStatement); } else { CurrentStatement.ToCount <int>(); } break; case LongCountResultOperator _: if (CurrentStatement.IsDistinct) { CurrentStatement.ConvertToCommonTableExpression(_session); CurrentStatement = new CountStatement <long>(CurrentStatement); } else { CurrentStatement.ToCount <long>(); } break; case FirstResultOperator first: CurrentStatement.Limit = 1; CurrentStatement.SingleValue = true; CurrentStatement.ReturnDefaultWhenEmpty = first.ReturnDefaultWhenEmpty; CurrentStatement.CanBeMultiples = true; break; case SingleResultOperator single: CurrentStatement.Limit = 2; CurrentStatement.SingleValue = true; CurrentStatement.ReturnDefaultWhenEmpty = single.ReturnDefaultWhenEmpty; CurrentStatement.CanBeMultiples = false; break; case DistinctResultOperator _: CurrentStatement.IsDistinct = true; CurrentStatement.ApplySqlOperator("distinct"); break; case AverageResultOperator _: CurrentStatement.ApplyAggregateOperator("AVG"); break; case SumResultOperator _: CurrentStatement.ApplyAggregateOperator("SUM"); break; case MinResultOperator _: CurrentStatement.ApplyAggregateOperator("MIN"); break; case MaxResultOperator _: CurrentStatement.ApplyAggregateOperator("MAX"); break; case ToJsonArrayResultOperator _: CurrentStatement.ToJsonSelector(); break; case LastResultOperator _: throw new InvalidOperationException("Marten does not support Last() or LastOrDefault() queries. Please reverse the ordering and use First()/FirstOrDefault() instead"); case IncludeResultOperator includeOp: var include = includeOp.BuildInclude(_session, fields); _provider.AllIncludes.Add(include); break; default: throw new NotSupportedException("Don't yet know how to deal with " + resultOperator); } }