@@ -60,6 +60,11 @@ public abstract partial class Loader
60
60
/// </summary>
61
61
private bool ? _canUseLimits ;
62
62
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
+
63
68
protected Loader ( ISessionFactoryImplementor factory )
64
69
{
65
70
_factory = factory ;
@@ -1078,10 +1083,9 @@ private void LoadFromResultSet(DbDataReader rs, int i, object obj, string instan
1078
1083
// advantage of two-phase-load (esp. components)
1079
1084
TwoPhaseLoad . AddUninitializedEntity ( key , obj , persister , lockMode , ! eagerPropertyFetch , session ) ;
1080
1085
1081
- // This is not very nice (and quite slow):
1082
1086
string [ ] [ ] cols = persister == rootPersister
1083
1087
? EntityAliases [ i ] . SuffixedPropertyAliases
1084
- : EntityAliases [ i ] . GetSuffixedPropertyAliases ( persister ) ;
1088
+ : GetSubclassEntityAliases ( i , persister ) ;
1085
1089
1086
1090
object [ ] values = persister . Hydrate ( rs , id , obj , rootPersister , cols , eagerPropertyFetch , session ) ;
1087
1091
@@ -1090,6 +1094,19 @@ private void LoadFromResultSet(DbDataReader rs, int i, object obj, string instan
1090
1094
TwoPhaseLoad . PostHydrate ( persister , id , values , rowId , obj , lockMode , ! eagerPropertyFetch , session ) ;
1091
1095
}
1092
1096
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
+
1093
1110
/// <summary>
1094
1111
/// Determine the concrete class of an instance for the <c>DbDataReader</c>
1095
1112
/// </summary>
0 commit comments