// Depth-first, pre-order visitor. // Note that the pre-order traversal is important for correctness of the transformations. public static IEnumerable<EdmEntityType> TypeHierarchyIterator(this EdmEntityType entityType, EdmModel model) { //Contract.Requires(entityType != null); yield return entityType; var derivedEntityTypes = model.GetDerivedTypes(entityType); if (derivedEntityTypes != null) { foreach (var derivedEntityType in derivedEntityTypes) { foreach (var derivedEntityType2 in derivedEntityType.TypeHierarchyIterator(model)) { yield return derivedEntityType2; } } } }
public void GetDerivedTypes_must_return_list_of_direct_descendants() { var model = new EdmModel().Initialize(); var entity1 = model.AddEntityType("E1"); var entity2 = model.AddEntityType("E2"); var entity3 = model.AddEntityType("E3"); var entity4 = model.AddEntityType("E4"); entity2.BaseType = entity1; entity3.BaseType = entity1; entity4.BaseType = entity2; var derivedTypes = model.GetDerivedTypes(entity1).ToList(); Assert.Equal(2, derivedTypes.Count); Assert.Same(entity2, derivedTypes[0]); Assert.Same(entity3, derivedTypes[1]); }