/// <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;
            }
        }