Skip to content

Commit fe84b90

Browse files
bahusoidfredericDelaporte
authored andcommitted
cache subclass entity aliases
1 parent f3e68d3 commit fe84b90

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

src/NHibernate/Async/Loader/Loader.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -722,10 +722,9 @@ private async Task LoadFromResultSetAsync(DbDataReader rs, int i, object obj, st
722722
// advantage of two-phase-load (esp. components)
723723
TwoPhaseLoad.AddUninitializedEntity(key, obj, persister, lockMode, !eagerPropertyFetch, session);
724724

725-
// This is not very nice (and quite slow):
726725
string[][] cols = persister == rootPersister
727726
? EntityAliases[i].SuffixedPropertyAliases
728-
: EntityAliases[i].GetSuffixedPropertyAliases(persister);
727+
: GetSubclassEntityAliases(i, persister);
729728

730729
object[] values = await (persister.HydrateAsync(rs, id, obj, rootPersister, cols, eagerPropertyFetch, session, cancellationToken)).ConfigureAwait(false);
731730

src/NHibernate/Loader/Loader.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)