Skip to content

Commit 755d130

Browse files
committed
Fix for projections with parameters
1 parent dce3d6e commit 755d130

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

src/NHibernate/Criterion/Order.cs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
using System;
2-
using System.Text;
3-
using NHibernate.Criterion;
42
using NHibernate.Engine;
53
using NHibernate.SqlCommand;
64

@@ -39,35 +37,47 @@ public Order(string propertyName, bool ascending)
3937
public virtual SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
4038
{
4139
SqlString[] columns = CriterionUtil.GetColumnNames(propertyName, projection, criteriaQuery, criteria);
42-
Type.IType type = projection?.GetTypes(criteria, criteriaQuery)[0] ?? criteriaQuery.GetTypeUsingProjection(criteria, propertyName);
40+
41+
bool[] toLowerColumns = ignoreCase ? FindStringColumns(criteria, criteriaQuery) : null;
4342

44-
StringBuilder fragment = new StringBuilder();
45-
ISessionFactoryImplementor factory = criteriaQuery.Factory;
43+
var factory = criteriaQuery.Factory;
44+
var fragment = new SqlStringBuilder();
4645
for (int i = 0; i < columns.Length; i++)
4746
{
48-
bool lower = ignoreCase && IsStringType(type.SqlTypes(factory)[i]);
47+
bool lower = toLowerColumns?[i] == true;
4948

5049
if (lower)
5150
{
52-
fragment.Append(factory.Dialect.LowercaseFunction)
53-
.Append("(");
51+
fragment
52+
.Add(factory.Dialect.LowercaseFunction)
53+
.Add("(");
5454
}
55-
fragment.Append(columns[i]);
55+
56+
fragment.Add(columns[i]);
5657

5758
if (lower)
5859
{
59-
fragment.Append(")");
60+
fragment.Add(")");
6061
}
6162

62-
fragment.Append(ascending ? " asc" : " desc");
63+
fragment.Add(ascending ? " asc" : " desc");
6364

6465
if (i < columns.Length - 1)
6566
{
66-
fragment.Append(", ");
67+
fragment.Add(", ");
6768
}
6869
}
6970

70-
return new SqlString(fragment.ToString());
71+
return fragment.ToSqlString();
72+
}
73+
74+
private bool[] FindStringColumns(ICriteria criteria, ICriteriaQuery criteriaQuery)
75+
{
76+
var type = projection == null
77+
? criteriaQuery.GetTypeUsingProjection(criteria, propertyName)
78+
: projection.GetTypes(criteria, criteriaQuery)[0];
79+
80+
return Array.ConvertAll(type.SqlTypes(criteriaQuery.Factory), t => IsStringType(t));
7181
}
7282

7383
public override string ToString()

0 commit comments

Comments
 (0)