public string ContinueFromManyToMany(string clazz, string[] joinColumns, QueryTranslator q) { Start(q); continuation = true; currentName = q.CreateNameFor(clazz); q.AddType(currentName, clazz); IQueryable classPersister = q.GetPersister(clazz); AddJoin(currentName, TypeFactory.ManyToOne(clazz), joinColumns); currentPropertyMapping = classPersister; return currentName; }
/// <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 { string entityClass = propertyType.GetAssociatedEntityName(); string name = q.CreateNameFor(entityClass); q.AddType(name, entityClass); //String[] keyColNames = memberPersister.getIdentifierColumnNames(); AddJoin(name, propertyType); if (propertyType.IsOneToOne) { oneToOneOwnerName = currentName; } else { oneToOneOwnerName = null; } ownerAssociationType = propertyType; currentName = name; currentProperty = propertyName; q.AddPathAliasAndJoin(path.ToString(0, path.ToString().LastIndexOf(StringHelper.Dot)), name, joinSequence.Copy()); componentPath.Length = 0; currentPropertyMapping = q.GetPersister(entityClass); } }