private void SetFields(ICriteriaQuery criteriaQuery) { //Persister is required, so let's use it as "initialized marker" if (Persister != null) { return; } if (!(criteriaQuery is ISupportEntityProjectionCriteriaQuery entityProjectionQuery)) { throw new ArgumentException( $"Projecting to entities requires a '{criteriaQuery.GetType().FullName}' type to implement " + $"{nameof(ISupportEntityProjectionCriteriaQuery)} interface.", nameof(criteriaQuery)); } var criteria = entityProjectionQuery.RootCriteria; if (!Lazy) { entityProjectionQuery.RegisterEntityProjection(this); } if (_entityType == null) { _entityType = criteria.GetRootEntityTypeIfAvailable(); } if (_entityAlias == null) { _entityAlias = criteria.Alias; } Persister = criteriaQuery.Factory.GetEntityPersister(_entityType.FullName) as IQueryable; if (Persister == null) { throw new HibernateException($"Projecting to entities requires a '{typeof(IQueryable).FullName}' persister, '{_entityType.FullName}' does not have one."); } ICriteria subcriteria = criteria.GetCriteriaByAlias(_entityAlias); if (subcriteria == null) { throw new HibernateException($"Criteria\\QueryOver alias '{_entityAlias}' for entity projection is not found."); } TableAlias = criteriaQuery.GetSQLAlias( subcriteria, Persister.IdentifierPropertyName ?? string.Empty); ColumnAliasSuffix = BasicLoader.GenerateSuffix(criteriaQuery.GetIndexForAlias()); _identifierColumnAliases = Persister.GetIdentifierAliases(ColumnAliasSuffix); _types = new IType[] { TypeFactory.ManyToOne(Persister.EntityName, true) }; }