private static IEnumerable <IGeometry> GetReferenceGeometries( [NotNull] IObject obj, [NotNull] IList <IRelationshipClass> relationshipChainToFeatureClass) { if (relationshipChainToFeatureClass.Count == 0) { yield break; } if (relationshipChainToFeatureClass.Count == 1) { foreach (IObject relatedObject in GdbQueryUtils.GetRelatedObjects(obj, relationshipChainToFeatureClass)) { var relatedFeature = relatedObject as IFeature; if (relatedFeature != null) { yield return(relatedFeature.Shape); } else { _msg.DebugFormat("Related object in spatial relation is not a feature: {0}", GdbObjectUtils.ToString(relatedObject)); } } } else { int?shapeFieldIndex = null; foreach (IRow joinedRow in GetJoinedRows(obj, relationshipChainToFeatureClass)) { // determine shape field index based on the first row if (shapeFieldIndex == null) { int index; if (TryGetShapeFieldIndex(joinedRow.Fields, out index)) { shapeFieldIndex = index; } else { _msg.WarnFormat( "Shape field not found in joined table for getting reference geometry for {0}", DatasetUtils.GetName(obj.Class)); yield break; } } yield return(joinedRow.Value[shapeFieldIndex.Value] as IGeometry); } } }