Hierarchische Relationen erlauben performante Abfragen über die Hierarchie. In der Api.Relation gibt es Methoden um Quelldatensätze über die gesamte Hierarchiezu finden.

Der erste Quelldatensatz bestimmter Typen

OrmBABase firstCompany = Api.Relation.GetFirstSourceOfType(EnumRelationType.Parent, BA.Contact.Enums.Extensions.EnumDataSourceExtension.Company, null, session, newMyData.Oid);
OrmBABase firstCompanyOrContact = Api.Relation.GetFirstSourceOfType(EnumRelationType.Parent, new Guid[] { BA.Contact.Enums.Extensions.EnumDataSourceExtension.Company, BA.Contact.Enums.Extensions.EnumDataSourceExtension.Contact }, null, session, newMyData.Oid);

Der oberste Quelldatensatz bestimmter Typen

OrmBABase topCompany = Api.Relation.GetTopSourceOfType(EnumRelationType.Parent, BA.Contact.Enums.Extensions.EnumDataSourceExtension.Company, null, session, newMyData.Oid);
OrmBABase topCompanyOrContact = Api.Relation.GetTopSourceOfType(EnumRelationType.Parent, new Guid[] { BA.Contact.Enums.Extensions.EnumDataSourceExtension.Company, BA.Contact.Enums.Extensions.EnumDataSourceExtension.Contact }, null, session, newMyData.Oid);

Für komplexere Hierarchieabfragen kann man eine Abfrage auf die Hierarchietabelle selbst erhalten.

IQueryable<OrmHierarchyRelationBase> hierarchyRelationQuery = RelationTools.GetHierarchyRelationsQuery(EnumRelationType.Parent, session);

Ein Beispiel wie man alle Anrufe erhält, die als Kinder und Kindeskinder zu dem aktuellen Datensatz in der gesamten Hierarchie zu finden sind.

IQueryable<Guid> phonecallsOids = hierarchyRelationQuery.Where(ff => ff.Source == newMyData.Oid && ff.TargetType == EnumDataSource.PhoneCall).Select(ff => ff.Target);
IQueryable<OrmPhoneCall> phonecallsWithRead = Api.ORM.GetQueryWithReadPermissions<OrmPhoneCall>(session);
IQueryable<OrmPhoneCall> phonecalls = phonecallsWithRead.Where(ff => phonecallsOids.Contains(ff.Oid));