Skip to content

Commit dae9cb1

Browse files
Adjustment to entity projection initialization. To be squashed.
1 parent 2475764 commit dae9cb1

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

src/NHibernate/Criterion/EntityProjection.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -83,33 +83,36 @@ public EntityProjection SetFetchLazyProperties(bool fetchLazyProperties = true)
8383

8484
IType[] IProjection.GetTypes(string alias, ICriteria criteria, ICriteriaQuery criteriaQuery)
8585
{
86-
return new[] { criteriaQuery.GetType(criteria, alias) };
86+
SetFields(criteriaQuery);
87+
return _entityAlias == alias
88+
? _types
89+
: null;
8790
}
8891

8992
IType[] IProjection.GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuery)
9093
{
91-
SetFields(criteria, criteriaQuery);
94+
SetFields(criteriaQuery);
9295

9396
return _types;
9497
}
9598

9699
string[] IProjection.GetColumnAliases(int position, ICriteria criteria, ICriteriaQuery criteriaQuery)
97100
{
98-
SetFields(criteria, criteriaQuery);
101+
SetFields(criteriaQuery);
99102

100103
return _identifierColumnAliases;
101104
}
102105

103106
string[] IProjection.GetColumnAliases(string alias, int position, ICriteria criteria, ICriteriaQuery criteriaQuery)
104107
{
105-
SetFields(criteria, criteriaQuery);
108+
SetFields(criteriaQuery);
106109

107110
return _identifierColumnAliases;
108111
}
109112

110113
SqlString IProjection.ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery)
111114
{
112-
SetFields(criteria, criteriaQuery);
115+
SetFields(criteriaQuery);
113116

114117
string identifierSelectFragment = Persister.IdentifierSelectFragment(TableAlias, ColumnAliasSuffix);
115118
return new SqlString(
@@ -132,20 +135,21 @@ TypedValue[] IProjection.GetTypedValues(ICriteria criteria, ICriteriaQuery crite
132135

133136
#endregion IProjection implementation
134137

135-
private void SetFields(ICriteria criteria, ICriteriaQuery criteriaQuery)
138+
private void SetFields(ICriteriaQuery criteriaQuery)
136139
{
137140
//Persister is required, so let's use it as "initialized marker"
138141
if (Persister != null)
139142
return;
140143

141-
if (Lazy == false)
144+
if (!(criteriaQuery is ISupportEntityProjectionCriteriaQuery entityProjectionQuery))
142145
{
143-
var entityProjectionQuery = criteriaQuery as ISupportEntityProjectionCriteriaQuery;
144-
if (entityProjectionQuery == null)
145-
{
146-
throw new HibernateException($"Projecting to entities requires a '{criteriaQuery.GetType().FullName}' type to implement {nameof(ISupportEntityProjectionCriteriaQuery)} interface.");
147-
}
146+
throw new HibernateException($"Projecting to entities requires a '{criteriaQuery.GetType().FullName}' type to implement {nameof(ISupportEntityProjectionCriteriaQuery)} interface.");
147+
}
148+
149+
var criteria = entityProjectionQuery.RootCriteria;
148150

151+
if (!Lazy)
152+
{
149153
entityProjectionQuery.RegisterEntityProjection(this);
150154
}
151155

@@ -175,7 +179,7 @@ private void SetFields(ICriteria criteria, ICriteriaQuery criteriaQuery)
175179

176180
_identifierColumnAliases = Persister.GetIdentifierAliases(ColumnAliasSuffix);
177181

178-
_types = new IType[] { TypeFactory.ManyToOne(Persister.EntityName, true), };
182+
_types = new IType[] { TypeFactory.ManyToOne(Persister.EntityName, true) };
179183
}
180184
}
181185
}

src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ public CriteriaImpl RootCriteria
113113
get { return rootCriteria; }
114114
}
115115

116+
ICriteria ISupportEntityProjectionCriteriaQuery.RootCriteria => rootCriteria;
117+
116118
public QueryParameters GetQueryParameters()
117119
{
118120
RowSelection selection = new RowSelection();
@@ -879,4 +881,4 @@ private void CreateSubQuerySpaces()
879881

880882
}
881883
}
882-
}
884+
}

src/NHibernate/Loader/Criteria/ISupportEntityProjectionCriteriaQuery.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,7 @@ namespace NHibernate.Loader.Criteria
66
public interface ISupportEntityProjectionCriteriaQuery
77
{
88
void RegisterEntityProjection(EntityProjection projection);
9+
10+
ICriteria RootCriteria { get; }
911
}
1012
}

0 commit comments

Comments
 (0)