diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs index fbe060fbb03..40248155c9a 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs @@ -337,9 +337,10 @@ public string RenderIdentifierSelect(int size, int k) /// the property select SQL fragment. public string RenderPropertySelect(int size, int k) { - return IsAllPropertyFetch - ? _elementType.RenderPropertySelect(size, k, IsAllPropertyFetch) - : _elementType.RenderPropertySelect(size, k, _fetchLazyProperties); + return _elementType.RenderPropertySelect( + size, + k, + IsAllPropertyFetch || _fetchLazyProperties?.Contains(TableAlias) == true); } public override SqlString RenderText(Engine.ISessionFactoryImplementor sessionFactory) diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementType.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementType.cs index d8328bfdbf8..ab2cbe4e955 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementType.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementType.cs @@ -195,31 +195,17 @@ public virtual string RenderScalarIdentifierSelect(int i) /// /// The total number of returned types. /// The sequence of the current returned type. - /// + /// /// the property select SQL fragment. - public string RenderPropertySelect(int size, int k, bool allProperties) - { - return RenderPropertySelect(size, k, null, allProperties); - } - - public string RenderPropertySelect(int size, int k, string[] fetchLazyProperties) - { - return RenderPropertySelect(size, k, fetchLazyProperties, false); - } - - private string RenderPropertySelect(int size, int k, string[] fetchLazyProperties, bool allProperties) + public string RenderPropertySelect(int size, int k, bool fetch) { CheckInitialized(); var queryable = Queryable; if (queryable == null) - return ""; + return string.Empty; - // Use the old method when fetchProperties is null to prevent any breaking changes - // 6.0 TODO: simplify condition by removing the fetchProperties part - string fragment = fetchLazyProperties == null || allProperties - ? queryable.PropertySelectFragment(TableAlias, GetSuffix(size, k), allProperties) - : queryable.PropertySelectFragment(TableAlias, GetSuffix(size, k), fetchLazyProperties); + var fragment = queryable.PropertySelectFragment(TableAlias, GetSuffix(size, k), fetch); return TrimLeadingCommaAndSpaces(fragment); } diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index 31d85e9c88d..1719a1dbbc3 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -1636,54 +1636,19 @@ public virtual string IdentifierSelectFragment(string name, string suffix) .ToSqlStringFragment(false); } - public string PropertySelectFragment(string name, string suffix, bool allProperties) + public string PropertySelectFragment(string name, string suffix, bool fetch) { - return PropertySelectFragment(name, suffix, null, allProperties); - } - - public string PropertySelectFragment(string name, string suffix, string[] fetchProperties) - { - return PropertySelectFragment(name, suffix, fetchProperties, false); - } - - private string PropertySelectFragment(string name, string suffix, string[] fetchProperties, bool allProperties) - { - SelectFragment select = new SelectFragment(Factory.Dialect) + var select = new SelectFragment(Factory.Dialect) .SetSuffix(suffix) .SetUsedAliases(IdentifierAliases); int[] columnTableNumbers = SubclassColumnTableNumberClosure; string[] columnAliases = SubclassColumnAliasClosure; string[] columns = SubclassColumnClosure; - HashSet fetchColumnsAndFormulas = null; - if (fetchProperties != null) - { - fetchColumnsAndFormulas = new HashSet(); - foreach (var fetchProperty in fetchProperties) - { - var index = GetSubclassPropertyIndex(fetchProperty); - if (index < 0) - { - throw new InvalidOperationException($"Property {fetchProperty} does not exist on entity {EntityName}"); - } - - var columnNames = SubclassPropertyColumnNameClosure[index]; - // Formulas will have all null values - if (columnNames.All(o => o == null)) - { - columnNames = SubclassPropertyFormulaTemplateClosure[index]; - } - - foreach (var columnName in columnNames) - { - fetchColumnsAndFormulas.Add(columnName); - } - } - } for (int i = 0; i < columns.Length; i++) { - bool selectable = (allProperties || !subclassColumnLazyClosure[i] || fetchColumnsAndFormulas?.Contains(columns[i]) == true) && + bool selectable = (fetch || !subclassColumnLazyClosure[i]) && !IsSubclassTableSequentialSelect(columnTableNumbers[i]) && subclassColumnSelectableClosure[i]; if (selectable) @@ -1698,7 +1663,7 @@ private string PropertySelectFragment(string name, string suffix, string[] fetch string[] formulaAliases = SubclassFormulaAliasClosure; for (int i = 0; i < formulaTemplates.Length; i++) { - bool selectable = (allProperties || !subclassFormulaLazyClosure[i] || fetchColumnsAndFormulas?.Contains(formulaTemplates[i]) == true) && + bool selectable = (fetch || !subclassFormulaLazyClosure[i]) && !IsSubclassTableSequentialSelect(formulaTableNumbers[i]); if (selectable) { diff --git a/src/NHibernate/Persister/Entity/IQueryable.cs b/src/NHibernate/Persister/Entity/IQueryable.cs index a0fe5934e8d..03cde427534 100644 --- a/src/NHibernate/Persister/Entity/IQueryable.cs +++ b/src/NHibernate/Persister/Entity/IQueryable.cs @@ -10,19 +10,6 @@ public enum Declarer SuperClass } - internal static class AbstractEntityPersisterExtensions - { - /// - /// Given a query alias and an identifying suffix, render the property select fragment. - /// - //6.0 TODO: Merge into IQueryable - public static string PropertySelectFragment(this IQueryable query, string alias, string suffix, string[] fetchProperties) - { - return ReflectHelper.CastOrThrow(query, "individual lazy property fetches") - .PropertySelectFragment(alias, suffix, fetchProperties); - } - } - /// /// Extends the generic ILoadable contract to add operations required by HQL ///