diff --git a/src/NHibernate.Test/Async/CompositeId/ClassWithCompositeIdFixture.cs b/src/NHibernate.Test/Async/CompositeId/ClassWithCompositeIdFixture.cs index dc4c498e440..92288ae1108 100644 --- a/src/NHibernate.Test/Async/CompositeId/ClassWithCompositeIdFixture.cs +++ b/src/NHibernate.Test/Async/CompositeId/ClassWithCompositeIdFixture.cs @@ -394,6 +394,18 @@ public async Task QueryOverOrderByAndWhereWithIdProjectionDoesntThrowAsync() } } + [Test] + public async Task CriteriaGroupProjectionAsync() + { + using (ISession s = OpenSession()) + { + await (s.CreateCriteria() + .SetProjection(Projections.GroupProperty(Projections.Id())) + .Add(Restrictions.Eq(Projections.Id(), id)) + .ListAsync()); + } + } + [Test] public async Task QueryOverInClauseAsync() { diff --git a/src/NHibernate.Test/CompositeId/ClassWithCompositeIdFixture.cs b/src/NHibernate.Test/CompositeId/ClassWithCompositeIdFixture.cs index edcec77d3ed..56bf7713b79 100644 --- a/src/NHibernate.Test/CompositeId/ClassWithCompositeIdFixture.cs +++ b/src/NHibernate.Test/CompositeId/ClassWithCompositeIdFixture.cs @@ -383,6 +383,18 @@ public void QueryOverOrderByAndWhereWithIdProjectionDoesntThrow() } } + [Test] + public void CriteriaGroupProjection() + { + using (ISession s = OpenSession()) + { + s.CreateCriteria() + .SetProjection(Projections.GroupProperty(Projections.Id())) + .Add(Restrictions.Eq(Projections.Id(), id)) + .List(); + } + } + [Test] public void QueryOverInClause() { diff --git a/src/NHibernate/Criterion/AggregateProjection.cs b/src/NHibernate/Criterion/AggregateProjection.cs index ce2a9f9804e..81b15d18c87 100644 --- a/src/NHibernate/Criterion/AggregateProjection.cs +++ b/src/NHibernate/Criterion/AggregateProjection.cs @@ -2,7 +2,6 @@ using NHibernate.SqlCommand; using NHibernate.Engine; using NHibernate.Type; -using NHibernate.Util; namespace NHibernate.Criterion { @@ -49,19 +48,12 @@ public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuer public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery) { - if (projection == null) - { - return new SqlString(aggregate, "(", criteriaQuery.GetColumn(criteria, propertyName), ") as y", loc.ToString(), "_"); - } + var column = CriterionUtil.GetColumnNameAsSqlStringPart(propertyName, projection, criteriaQuery, criteria); return new SqlString( aggregate, "(", - SqlStringHelper.RemoveAsAliasesFromSql( - projection.ToSqlString( - criteria, - loc, - criteriaQuery)), + column, ") as y", loc.ToString(), "_"); diff --git a/src/NHibernate/Criterion/AvgProjection.cs b/src/NHibernate/Criterion/AvgProjection.cs index 9420547ae33..a7cad5a42ab 100644 --- a/src/NHibernate/Criterion/AvgProjection.cs +++ b/src/NHibernate/Criterion/AvgProjection.cs @@ -23,7 +23,7 @@ public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuer sql.Add("cast("); if (projection != null) { - sql.Add(SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery))); + sql.AddObject(CriterionUtil.GetColumnNameAsSqlStringPart(projection, criteriaQuery, criteria)); } else { diff --git a/src/NHibernate/Criterion/BetweenExpression.cs b/src/NHibernate/Criterion/BetweenExpression.cs index c07114d1f96..eb0ec058279 100644 --- a/src/NHibernate/Criterion/BetweenExpression.cs +++ b/src/NHibernate/Criterion/BetweenExpression.cs @@ -53,13 +53,13 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri var parametersTypes = GetTypedValues(criteria, criteriaQuery).ToArray(); var lowType = parametersTypes[0]; var highType = parametersTypes[1]; - SqlString[] columnNames = - CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria); + var columnNames = + CriterionUtil.GetColumnNamesAsSqlStringParts(_propertyName, _projection, criteriaQuery, criteria); if (columnNames.Length == 1) { sqlBuilder - .Add(columnNames[0]) + .AddObject(columnNames[0]) .Add(" between ") .Add(criteriaQuery.NewQueryParameter(lowType).Single()) .Add(" and ") @@ -78,7 +78,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri } andNeeded = true; - sqlBuilder.Add(columnNames[i]) + sqlBuilder.AddObject(columnNames[i]) .Add(" >= ") .Add(lowParameters[i]); } @@ -87,7 +87,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri for (int i = 0; i < columnNames.Length; i++) { sqlBuilder.Add(" AND ") - .Add(columnNames[i]) + .AddObject(columnNames[i]) .Add(" <= ") .Add(highParameters[i]); } diff --git a/src/NHibernate/Criterion/CastProjection.cs b/src/NHibernate/Criterion/CastProjection.cs index 3019ddcbca5..2425cb5cd14 100644 --- a/src/NHibernate/Criterion/CastProjection.cs +++ b/src/NHibernate/Criterion/CastProjection.cs @@ -37,9 +37,7 @@ public override SqlString ToSqlString(ICriteria criteria, int position, ICriteri throw new QueryException("invalid Hibernate type for CastProjection"); } string sqlType = factory.Dialect.GetCastTypeName(sqlTypeCodes[0]); - int loc = position*GetHashCode(); - SqlString val = projection.ToSqlString(criteria, loc, criteriaQuery); - val = SqlStringHelper.RemoveAsAliasesFromSql(val); + var val = CriterionUtil.GetColumnNameAsSqlStringPart(projection, criteriaQuery, criteria); return new SqlString("cast( ", val, " as ", sqlType, ") as ", GetColumnAliases(position, criteria, criteriaQuery)[0]); } diff --git a/src/NHibernate/Criterion/ConditionalProjection.cs b/src/NHibernate/Criterion/ConditionalProjection.cs index c9f948ad046..700b621b575 100644 --- a/src/NHibernate/Criterion/ConditionalProjection.cs +++ b/src/NHibernate/Criterion/ConditionalProjection.cs @@ -45,10 +45,8 @@ public override bool IsAggregate public override SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery) { SqlString condition = criterion.ToSqlString(criteria, criteriaQuery); - SqlString ifTrue = whenTrue.ToSqlString(criteria, position + GetHashCode() + 1, criteriaQuery); - ifTrue = SqlStringHelper.RemoveAsAliasesFromSql(ifTrue); - SqlString ifFalse = whenFalse.ToSqlString(criteria, position + GetHashCode() + 2, criteriaQuery); - ifFalse = SqlStringHelper.RemoveAsAliasesFromSql(ifFalse); + var ifTrue = CriterionUtil.GetColumnNameAsSqlStringPart(whenTrue, criteriaQuery, criteria); + var ifFalse = CriterionUtil.GetColumnNameAsSqlStringPart(whenFalse, criteriaQuery, criteria); return new SqlString("(case when ", condition, " then ", ifTrue, " else ", ifFalse, " end) as ", GetColumnAliases(position, criteria, criteriaQuery)[0]); } diff --git a/src/NHibernate/Criterion/CountProjection.cs b/src/NHibernate/Criterion/CountProjection.cs index 6c955d0791b..5d6e5cb4d1d 100644 --- a/src/NHibernate/Criterion/CountProjection.cs +++ b/src/NHibernate/Criterion/CountProjection.cs @@ -35,7 +35,7 @@ public override SqlString ToSqlString(ICriteria criteria, int position, ICriteri } if (projection != null) { - buf.Add(SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, position, criteriaQuery))); + buf.AddObject(CriterionUtil.GetColumnNameAsSqlStringPart(projection, criteriaQuery, criteria)); } else { diff --git a/src/NHibernate/Criterion/CriterionUtil.cs b/src/NHibernate/Criterion/CriterionUtil.cs index 175ce58dbe1..76385384783 100644 --- a/src/NHibernate/Criterion/CriterionUtil.cs +++ b/src/NHibernate/Criterion/CriterionUtil.cs @@ -5,7 +5,6 @@ namespace NHibernate.Criterion using Engine; using SqlCommand; using Type; - using Util; public static class CriterionUtil { @@ -51,13 +50,53 @@ internal static SqlString[] GetColumnNamesUsingProjection(IProjection projection return GetColumnNamesUsingPropertyName(criteriaQuery, criteria, propertyProjection.PropertyName); } - SqlString sqlString = projection.ToSqlString(criteria, - criteriaQuery.GetIndexForAlias(), - criteriaQuery); - return new SqlString[] - { - SqlStringHelper.RemoveAsAliasesFromSql(sqlString) - }; + return GetProjectionColumns(projection, criteriaQuery, criteria); + } + + internal static object[] GetColumnNamesAsSqlStringParts(string propertyName, IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria) + { + if (propertyName != null) + return criteriaQuery.GetColumnsUsingProjection(criteria, propertyName); + + return GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria); + } + + internal static object[] GetColumnNamesAsSqlStringParts(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria) + { + if (projection is IPropertyProjection propertyProjection) + { + return criteriaQuery.GetColumnsUsingProjection(criteria, propertyProjection.PropertyName); + } + + return GetProjectionColumns(projection, criteriaQuery, criteria); + } + + internal static object GetColumnNameAsSqlStringPart(string propertyName, IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria) + { + var columnNames = GetColumnNamesAsSqlStringParts(propertyName, projection, criteriaQuery, criteria); + if (columnNames.Length != 1) + { + throw new QueryException("property or projection does not map to a single column: " + (propertyName ?? projection.ToString())); + } + + return columnNames[0]; + } + + internal static object GetColumnNameAsSqlStringPart(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria) + { + var columnNames = GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria); + if (columnNames.Length != 1) + { + throw new QueryException("property or projection does not map to a single column: " + (projection.ToString())); + } + + return columnNames[0]; + } + + private static SqlString[] GetProjectionColumns(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria) + { + var sqlString = projection.ToSqlString(criteria, criteriaQuery.GetIndexForAlias(), criteriaQuery); + return new[] {SqlStringHelper.RemoveAsAliasesFromSql(sqlString)}; } private static SqlString[] GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery, ICriteria criteria, string propertyName) @@ -121,5 +160,18 @@ public static TypedValue[] GetTypedValues(ICriteriaQuery criteriaQuery, ICriteri } return types.ToArray(); } + + public static TypedValue GetTypedValue( + ICriteriaQuery criteriaQuery, + ICriteria criteria, + IProjection projection, + string propertyName, + object value) + { + if (propertyName != null || (propertyName = (projection as IPropertyProjection)?.PropertyName) != null) + return criteriaQuery.GetTypedValue(criteria, propertyName, value); + + return new TypedValue(NHibernateUtil.GuessType(value), value); + } } } diff --git a/src/NHibernate/Criterion/GroupedProjection.cs b/src/NHibernate/Criterion/GroupedProjection.cs index f037160f32e..4bef3f4e716 100644 --- a/src/NHibernate/Criterion/GroupedProjection.cs +++ b/src/NHibernate/Criterion/GroupedProjection.cs @@ -23,6 +23,9 @@ public virtual SqlString ToSqlString(ICriteria criteria, int position, ICriteria public virtual SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) { + if (projection is IPropertyProjection propertyProjection) + return new SqlString(string.Join(", ", criteriaQuery.GetColumns(criteria, propertyProjection.PropertyName))); + //This is kind of a hack. The hack is based on the fact that ToGroupSqlString always called after ToSqlString. return SqlStringHelper.RemoveAsAliasesFromSql(renderedProjection); } diff --git a/src/NHibernate/Criterion/IdentifierEqExpression.cs b/src/NHibernate/Criterion/IdentifierEqExpression.cs index 6654aba0ff9..f75d400f12d 100644 --- a/src/NHibernate/Criterion/IdentifierEqExpression.cs +++ b/src/NHibernate/Criterion/IdentifierEqExpression.cs @@ -69,8 +69,7 @@ private void AddValueOrProjection(Parameter[] parameters, int paramIndex, ICrite } else { - SqlString sql = _projection.ToSqlString(criteria, GetHashCode(), criteriaQuery); - result.Add(SqlStringHelper.RemoveAsAliasesFromSql(sql)); + result.AddObject(CriterionUtil.GetColumnNameAsSqlStringPart(_projection, criteriaQuery, criteria)); } } diff --git a/src/NHibernate/Criterion/InsensitiveLikeExpression.cs b/src/NHibernate/Criterion/InsensitiveLikeExpression.cs index 7a66e3f92e2..e2eb2dab0c7 100644 --- a/src/NHibernate/Criterion/InsensitiveLikeExpression.cs +++ b/src/NHibernate/Criterion/InsensitiveLikeExpression.cs @@ -63,8 +63,8 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri { //TODO: add default capacity SqlStringBuilder sqlBuilder = new SqlStringBuilder(); - SqlString[] columnNames = - CriterionUtil.GetColumnNames(propertyName, projection, criteriaQuery, criteria); + var columnNames = + CriterionUtil.GetColumnNamesAsSqlStringParts(propertyName, projection, criteriaQuery, criteria); if (columnNames.Length != 1) { @@ -73,14 +73,14 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri if (criteriaQuery.Factory.Dialect is PostgreSQLDialect) { - sqlBuilder.Add(columnNames[0]); + sqlBuilder.AddObject(columnNames[0]); sqlBuilder.Add(" ilike "); } else { sqlBuilder.Add(criteriaQuery.Factory.Dialect.LowercaseFunction) .Add("(") - .Add(columnNames[0]) + .AddObject(columnNames[0]) .Add(")") .Add(" like "); } @@ -106,11 +106,7 @@ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery c public TypedValue GetParameterTypedValue(ICriteria criteria, ICriteriaQuery criteriaQuery) { var matchValue = value.ToString().ToLower(); - if (projection != null) - { - return CriterionUtil.GetTypedValues(criteriaQuery, criteria, projection, null, matchValue).Single(); - } - return criteriaQuery.GetTypedValue(criteria, propertyName, matchValue); + return CriterionUtil.GetTypedValue(criteriaQuery, criteria, projection, propertyName, matchValue); } public override IProjection[] GetProjections() @@ -127,4 +123,4 @@ public override string ToString() return (projection ?? (object)propertyName) + " ilike " + value; } } -} \ No newline at end of file +} diff --git a/src/NHibernate/Criterion/LikeExpression.cs b/src/NHibernate/Criterion/LikeExpression.cs index 6cbaba95bc6..8b2eb65efe5 100644 --- a/src/NHibernate/Criterion/LikeExpression.cs +++ b/src/NHibernate/Criterion/LikeExpression.cs @@ -59,7 +59,7 @@ public LikeExpression(string propertyName, string value, MatchMode matchMode, ch public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) { - SqlString[] columns = CriterionUtil.GetColumnNamesUsingProjection(projection, criteriaQuery, criteria); + var columns = CriterionUtil.GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria); if (columns.Length != 1) throw new HibernateException("Like may only be used with single-column properties / projections."); @@ -70,11 +70,11 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri Dialect.Dialect dialect = criteriaQuery.Factory.Dialect; lhs.Add(dialect.LowercaseFunction) .Add(StringHelper.OpenParen) - .Add(columns[0]) + .AddObject(columns[0]) .Add(StringHelper.ClosedParen); } else - lhs.Add(columns[0]); + lhs.AddObject(columns[0]); if (ignoreCase) { diff --git a/src/NHibernate/Criterion/NotNullExpression.cs b/src/NHibernate/Criterion/NotNullExpression.cs index f08fc7bdd30..0d7df9dc039 100644 --- a/src/NHibernate/Criterion/NotNullExpression.cs +++ b/src/NHibernate/Criterion/NotNullExpression.cs @@ -39,8 +39,8 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri //TODO: add default capacity SqlStringBuilder sqlBuilder = new SqlStringBuilder(); - SqlString[] columnNames = - CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria); + var columnNames = + CriterionUtil.GetColumnNamesAsSqlStringParts(_propertyName, _projection, criteriaQuery, criteria); bool opNeeded = false; @@ -52,7 +52,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri } opNeeded = true; - sqlBuilder.Add(columnNames[i]) + sqlBuilder.AddObject(columnNames[i]) .Add(" is not null"); } diff --git a/src/NHibernate/Criterion/NullExpression.cs b/src/NHibernate/Criterion/NullExpression.cs index cbd0a955575..b3d46150691 100644 --- a/src/NHibernate/Criterion/NullExpression.cs +++ b/src/NHibernate/Criterion/NullExpression.cs @@ -38,8 +38,8 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri //TODO: add default capacity SqlStringBuilder sqlBuilder = new SqlStringBuilder(); - SqlString[] columnNames = - CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria); + var columnNames = + CriterionUtil.GetColumnNamesAsSqlStringParts(_propertyName, _projection, criteriaQuery, criteria); for (int i = 0; i < columnNames.Length; i++) { @@ -48,7 +48,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri sqlBuilder.Add(" and "); } - sqlBuilder.Add(columnNames[i]) + sqlBuilder.AddObject(columnNames[i]) .Add(" is null"); } diff --git a/src/NHibernate/Criterion/Order.cs b/src/NHibernate/Criterion/Order.cs index 14cabbae790..8b366ad5fe9 100644 --- a/src/NHibernate/Criterion/Order.cs +++ b/src/NHibernate/Criterion/Order.cs @@ -75,7 +75,7 @@ private object[] GetColumnsOrAliases(ICriteria criteria, ICriteriaQuery criteria var propName = propertyName ?? (projection as IPropertyProjection)?.PropertyName; return propName != null ? criteriaQuery.GetColumnAliasesUsingProjection(criteria, propName) - : (object[]) CriterionUtil.GetColumnNamesUsingProjection(projection, criteriaQuery, criteria); + : CriterionUtil.GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria); } private SqlType[] SqlTypes(ICriteria criteria, ICriteriaQuery criteriaQuery) diff --git a/src/NHibernate/Criterion/PropertyExpression.cs b/src/NHibernate/Criterion/PropertyExpression.cs index 5453b982c75..b27bd3184d3 100644 --- a/src/NHibernate/Criterion/PropertyExpression.cs +++ b/src/NHibernate/Criterion/PropertyExpression.cs @@ -70,31 +70,28 @@ protected PropertyExpression(string lhsPropertyName, IProjection rhsProjection) public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) { - SqlString[] columnNames = - CriterionUtil.GetColumnNames(_lhsPropertyName, _lhsProjection, criteriaQuery, criteria); - SqlString[] otherColumnNames = - CriterionUtil.GetColumnNames(_rhsPropertyName, _rhsProjection, criteriaQuery, criteria); + var columnNames = + CriterionUtil.GetColumnNamesAsSqlStringParts(_lhsPropertyName, _lhsProjection, criteriaQuery, criteria); + var otherColumnNames = + CriterionUtil.GetColumnNamesAsSqlStringParts(_rhsPropertyName, _rhsProjection, criteriaQuery, criteria); - SqlStringBuilder sb = new SqlStringBuilder(); - if (columnNames.Length > 1) + switch (columnNames.Length) { - sb.Add(StringHelper.OpenParen); - } - bool first = true; - foreach (SqlString sqlString in SqlStringHelper.Add(columnNames, Op, otherColumnNames)) - { - if (first == false) - { - sb.Add(" and "); - } - first = false; - sb.Add(sqlString); + case 1: + return new SqlString(columnNames[0], Op, otherColumnNames[0]); + case 0: + return SqlString.Empty; } - if (columnNames.Length > 1) + var sb = new SqlStringBuilder(); + sb.Add(StringHelper.OpenParen); + sb.AddObject(columnNames[0]).Add(Op).AddObject(otherColumnNames[0]); + for (var i = 1; i < columnNames.Length; i++) { - sb.Add(StringHelper.ClosedParen); + sb.Add(" and "); + sb.AddObject(columnNames[i]).Add(Op).AddObject(otherColumnNames[i]); } + sb.Add(StringHelper.ClosedParen); return sb.ToSqlString(); } diff --git a/src/NHibernate/Criterion/SimpleExpression.cs b/src/NHibernate/Criterion/SimpleExpression.cs index be1266eda70..8b19ec50126 100644 --- a/src/NHibernate/Criterion/SimpleExpression.cs +++ b/src/NHibernate/Criterion/SimpleExpression.cs @@ -156,11 +156,7 @@ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery c public TypedValue GetParameterTypedValue(ICriteria criteria, ICriteriaQuery criteriaQuery) { object icvalue = ignoreCase ? value.ToString().ToLower() : value; - if (_projection != null) - { - return CriterionUtil.GetTypedValues(criteriaQuery, criteria, _projection, null, icvalue).Single(); - } - return criteriaQuery.GetTypedValue(criteria, propertyName, icvalue); + return CriterionUtil.GetTypedValue(criteriaQuery, criteria, _projection, propertyName, icvalue); } public override IProjection[] GetProjections() diff --git a/src/NHibernate/Criterion/SqlFunctionProjection.cs b/src/NHibernate/Criterion/SqlFunctionProjection.cs index 0c3bba98f98..db9fd336f63 100644 --- a/src/NHibernate/Criterion/SqlFunctionProjection.cs +++ b/src/NHibernate/Criterion/SqlFunctionProjection.cs @@ -82,8 +82,8 @@ public override SqlString ToSqlString(ICriteria criteria, int position, ICriteri var arguments = new List(); for (int i = 0; i < args.Length; i++) { - SqlString projectArg = GetProjectionArgument(criteriaQuery, criteria, args[i], 0); // The loc parameter is unused. - arguments.Add(projectArg); + var projectArg = GetProjectionArguments(criteriaQuery, criteria, args[i]); + arguments.AddRange(projectArg); } return new SqlString( @@ -107,10 +107,9 @@ private ISQLFunction GetFunction(ICriteriaQuery criteriaQuery) return dialectFunction; } - private static SqlString GetProjectionArgument(ICriteriaQuery criteriaQuery, ICriteria criteria, IProjection projection, int loc) + private static object[] GetProjectionArguments(ICriteriaQuery criteriaQuery, ICriteria criteria, IProjection projection) { - SqlString sql = projection.ToSqlString(criteria, loc, criteriaQuery); - return SqlStringHelper.RemoveAsAliasesFromSql(sql); + return CriterionUtil.GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria); } public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuery) diff --git a/src/NHibernate/SqlCommand/SqlStringHelper.cs b/src/NHibernate/SqlCommand/SqlStringHelper.cs index ccc4e2da9ac..d1aa2af5c3b 100644 --- a/src/NHibernate/SqlCommand/SqlStringHelper.cs +++ b/src/NHibernate/SqlCommand/SqlStringHelper.cs @@ -59,6 +59,12 @@ public static SqlString[] Add(SqlString[] x, string sep, SqlString[] y) return result; } + /// + /// Removes the as someColumnAlias clause from a SqlString representing a column expression. + /// Consider using CriterionUtil.GetColumn... methods instead. + /// + /// The SqlString representing a column expression which might be aliased. + /// if it was not aliased, otherwise an un-aliased SqlString representing the column. public static SqlString RemoveAsAliasesFromSql(SqlString sql) { int index = sql.LastIndexOfCaseInsensitive(" as ");