/// <summary> /// /// </summary> /// <param name="propertyName"></param> /// <param name="propertyType"></param> /// <param name="q"></param> /// <remarks>NOTE: we avoid joining to the next table if the named property is just the foreign key value</remarks> private void DereferenceEntity( string propertyName, EntityType propertyType, QueryTranslator q ) { //if its "id" bool isIdShortcut = EntityID.Equals(propertyName) && !propertyType.IsUniqueKeyReference; //or its the id property name string idPropertyName; try { idPropertyName = propertyType.GetIdentifierOrUniqueKeyPropertyName( q.Factory ); } catch (MappingException me) { throw new QueryException(me); } bool isNamedIdPropertyShortcut = idPropertyName != null && idPropertyName.Equals( propertyName ); if ( isIdShortcut || isNamedIdPropertyShortcut ) { // special shortcut for id properties, skip the join! // this must only occur at the _end_ of a path expression DereferenceProperty( propertyName ); } else { System.Type entityClass = propertyType.AssociatedClass; String name = q.CreateNameFor( entityClass ); q.AddType( name, entityClass ); IQueryable memberPersister = q.GetPersister( entityClass ); //String[] keyColNames = memberPersister.getIdentifierColumnNames(); string[] keyColNames; try { keyColNames = propertyType.GetReferencedColumns( q.Factory ); } catch (MappingException me) { throw new QueryException(me); } AddJoin( memberPersister.TableName, name, keyColNames ); if ( propertyType.IsOneToOne ) { oneToOneOwnerName = currentName; } currentName = name; currentProperty = propertyName; q.AddPathAliasAndJoin( path.Substring( 0, path.LastIndexOf( StringHelper.Dot ) ), name, join ); componentPath = null; //componentPath = new StringBuilder( ); currentPropertyMapping = memberPersister; } }