@@ -60,6 +60,11 @@ public abstract partial class Loader
6060 /// </summary>
6161 private bool ? _canUseLimits ;
6262
63+ /// <summary>
64+ /// Caches subclass entity aliases for given persister index in <see cref="EntityPersisters"/> and subclass entity name
65+ /// </summary>
66+ private readonly Dictionary < Tuple < int , string > , string [ ] [ ] > _subclassEntityAliasesMap = new Dictionary < Tuple < int , string > , string [ ] [ ] > ( ) ;
67+
6368 protected Loader ( ISessionFactoryImplementor factory )
6469 {
6570 _factory = factory ;
@@ -1078,10 +1083,9 @@ private void LoadFromResultSet(DbDataReader rs, int i, object obj, string instan
10781083 // advantage of two-phase-load (esp. components)
10791084 TwoPhaseLoad . AddUninitializedEntity ( key , obj , persister , lockMode , ! eagerPropertyFetch , session ) ;
10801085
1081- // This is not very nice (and quite slow):
10821086 string [ ] [ ] cols = persister == rootPersister
10831087 ? EntityAliases [ i ] . SuffixedPropertyAliases
1084- : EntityAliases [ i ] . GetSuffixedPropertyAliases ( persister ) ;
1088+ : GetSubclassEntityAliases ( i , persister ) ;
10851089
10861090 object [ ] values = persister . Hydrate ( rs , id , obj , rootPersister , cols , eagerPropertyFetch , session ) ;
10871091
@@ -1090,6 +1094,19 @@ private void LoadFromResultSet(DbDataReader rs, int i, object obj, string instan
10901094 TwoPhaseLoad . PostHydrate ( persister , id , values , rowId , obj , lockMode , ! eagerPropertyFetch , session ) ;
10911095 }
10921096
1097+ private string [ ] [ ] GetSubclassEntityAliases ( int i , ILoadable persister )
1098+ {
1099+ var cacheKey = System . Tuple . Create ( i , persister . EntityName ) ;
1100+ if ( _subclassEntityAliasesMap . TryGetValue ( cacheKey , out string [ ] [ ] cols ) )
1101+ {
1102+ return cols ;
1103+ }
1104+
1105+ cols = EntityAliases [ i ] . GetSuffixedPropertyAliases ( persister ) ;
1106+ _subclassEntityAliasesMap [ cacheKey ] = cols ;
1107+ return cols ;
1108+ }
1109+
10931110 /// <summary>
10941111 /// Determine the concrete class of an instance for the <c>DbDataReader</c>
10951112 /// </summary>
0 commit comments