private string GetWholeAssociationPath(CriteriaImpl.Subcriteria subcriteria, out string parentAlias) { string path = subcriteria.Path; // some messy, complex stuff here, since createCriteria() can take an // aliased path, or a path rooted at the creating criteria instance ICriteria parent = null; if (StringHelper.IsNotRoot(path, out var testAlias)) { // if it is a compound path if (!testAlias.Equals(subcriteria.Alias)) { // and the qualifier is not the alias of this criteria // -> check to see if we belong to some criteria other // than the one that created us aliasCriteriaMap.TryGetValue(testAlias, out parent); } } if (parent == null) { // otherwise assume the parent is the the criteria that created us parent = subcriteria.Parent; } else { path = StringHelper.Unroot(path); } parentAlias = parent.Alias; if (parent.Equals(rootCriteria)) { // if its the root criteria, we are done return(path); } else { // otherwise, recurse return(GetWholeAssociationPath((CriteriaImpl.Subcriteria)parent, out _) + '.' + path); } }