Thanks to Martin Drab's article New metadata API – Goshoom.NET Dev Blog, I refactored one method of my Table Metadata browser by using Microsoft.Dynamics.AX.Metadata.MetaModel API to loop through the list of table relations.
public static wzhRelatedTablesTmp populateRelatedTables(TableId _tableId, FieldId _fieldId) { wzhRelatedTablesTmp wzhRelatedTablesTmp; System.Collections.IEnumerable relations; System.Collections.IEnumerator enumRelations; System.Collections.IEnumerable constraints; System.Collections.IEnumerator enumConstraints; mtdModel.AxTableRelation relation; mtdModel.AxTableRelationConstraint constraint; mtdModel.AxTableRelationConstraintField constraintField; mtdModel.AxTable table; TableName relatedTableName = tableId2Name(_tableId); FieldName relatedFieldName = fieldId2Name(_tableId, _fieldId); System.Collections.IEnumerable tables = mtdSupport::GetAllTables(); System.Collections.IEnumerator enumTables = tables.GetEnumerator(); // Loop through all tables in the system while (enumTables.MoveNext()) { table = enumTables.Current as mtdModel.AxTable; relations = mtdSupport::GetTableRelations(table.Name) as System.Collections.IEnumerable; enumRelations = relations.GetEnumerator(); while (enumRelations.moveNext()) { relation = enumRelations.Current as mtdModel.AxTableRelation; if (relation && relation.RelatedTable == relatedTableName) { enumConstraints = relation.Constraints.GetEnumerator(); while (enumConstraints.moveNext()) { constraint = enumConstraints.Current as mtdModel.AxTableRelationConstraint; if (constraint is mtdModel.AxTableRelationConstraintField) { constraintField = constraint as mtdModel.AxTableRelationConstraintField; // Check if the relation is with a given table if (constraintField && constraintField.RelatedField == relatedFieldName) { wzhRelatedTablesTmp.clear(); wzhRelatedTablesTmp.Id = tableName2Id(table.Name); wzhRelatedTablesTmp.FieldName = constraintField.Field; wzhRelatedTablesTmp.FieldId = fieldname2id(wzhRelatedTablesTmp.Id, constraintField.Field); wzhRelatedTablesTmp.RelatedTableName = table.Name; wzhRelatedTablesTmp.Label = table.Label; wzhRelatedTablesTmp.RelatedTablePName = SysLabel::labelId2String(table.Label); wzhRelatedTablesTmp.RelationName = relation.Name; wzhRelatedTablesTmp.Role = relation.Role; wzhRelatedTablesTmp.RelatedTableRole = relation.RelatedTableRole; wzhRelatedTablesTmp.RelatedTableCardinality = relation.RelatedTableCardinality; wzhRelatedTablesTmp.IsEDTRelation = relation.EDTRelation; wzhRelatedTablesTmp.Cardinality = relation.Cardinality; wzhRelatedTablesTmp.RelationshipType = relation.RelationshipType; wzhRelatedTablesTmp.OnDeleteAction = relation.OnDelete.ToString(); wzhRelatedTablesTmp.insert(); } } } } } } return wzhRelatedTablesTmp; }