internal List <HierarchyRow> GetRelationshipChildrenFromLayer(BasicFeatureLayer member, long objectID) { var children = new List <HierarchyRow>(); CIMBasicFeatureLayer bfl = member.GetDefinition() as CIMBasicFeatureLayer; var relates = bfl.FeatureTable.Relates; if (relates == null || relates.Length == 0) { return(children); } foreach (var relate in relates) { if (!(relate.DataConnection is CIMStandardDataConnection) && !(relate.DataConnection is CIMFeatureDatasetDataConnection)) { continue;//Not supported in this sample } var sdc = relate.DataConnection as CIMStandardDataConnection; var fdc = relate.DataConnection as CIMFeatureDatasetDataConnection; var factory = sdc?.WorkspaceFactory ?? fdc.WorkspaceFactory; var path = sdc?.WorkspaceConnectionString ?? fdc.WorkspaceConnectionString; if (string.IsNullOrEmpty(path)) { continue;//No connection information we can use } path = path.Replace("DATABASE=", ""); var dstype = sdc?.DatasetType ?? fdc.DatasetType; if (dstype != esriDatasetType.esriDTFeatureClass && dstype != esriDatasetType.esriDTTable) { continue;//Not supported in the sample } var dsname = sdc?.Dataset ?? fdc.Dataset; var featDatasetName = fdc?.FeatureDataset ?? ""; Geodatabase gdb = null; if (factory == WorkspaceFactory.FileGDB) { gdb = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(path, UriKind.Absolute))); } else if (factory == WorkspaceFactory.SDE) { gdb = new Geodatabase(new DatabaseConnectionFile(new Uri(path, UriKind.Absolute))); } Table table = null; //We have to open a type specific dataset - FeatureClass or Table //We cannot simply use 'Table' for both if (dstype == esriDatasetType.esriDTFeatureClass) { table = GetDatasetFromGeodatabase <FeatureClass>(gdb, dsname, featDatasetName); } else { table = GetDatasetFromGeodatabase <Table>(gdb, dsname, featDatasetName); } if (table == null) { continue;//Related dataset not found } //Get any related rows var qry_fld = table.GetDefinition().GetFields().FirstOrDefault(f => f.Name == relate.ForeignKey); if (qry_fld == null) { continue;//We cannot find the designated foreign key } //Load relevant values var inspector = new Inspector(); inspector.Load(member, objectID); var need_quotes = qry_fld.FieldType == FieldType.String; var quote = need_quotes ? "'" : ""; var where = $"{relate.ForeignKey} = {quote}{inspector[relate.PrimaryKey]}{quote}"; var qf = new QueryFilter() { WhereClause = where, SubFields = $"{table.GetDefinition().GetObjectIDField()}, {relate.ForeignKey}" }; var childHRow = new HierarchyRow() { name = dsname, type = $"{inspector[relate.PrimaryKey]}" }; using (var rc = table.Search(qf)) { while (rc.MoveNext()) { using (var row = rc.Current) { var id = row.GetObjectID(); var HRow = new HierarchyRow() { name = $"{id}", type = relate.ForeignKey }; childHRow.children.Add(HRow); } } } children.Add(childHRow); } return(children); }