/// <summary>
 /// Returns the subtype of the EntityType in the current itemCollection
 /// </summary>
 public IEnumerable<EntityType> GetSubtypesOf(EntityType type, ItemCollection itemCollection, bool includeAbstractTypes)
 {
     if (type != null)
     {
         IEnumerable<EntityType> typesInCollection = itemCollection.GetItems<EntityType>();
         foreach (EntityType typeInCollection in typesInCollection)
         {
             if (type.Equals(typeInCollection) == false && this.IsSubtypeOf(typeInCollection, type))
             {
                 if (includeAbstractTypes || !typeInCollection.Abstract)
                 {
                     yield return typeInCollection;
                 }
             }
         }
     }
 }
        private static IEnumerable<EntityType> GetTypeAndSubtypesOf(EntityType entityType, EdmItemCollection itemCollection)
        {
            // Always include the specified type, even if it's abstract
            yield return entityType;

            // Get the subtypes of the type from the item collection
            IEnumerable<EntityType> entityTypesInCollection = itemCollection.OfType<EntityType>();
            foreach (EntityType typeInCollection in entityTypesInCollection)
            {
                if (entityType.Equals(typeInCollection) == false && IsStrictSubtypeOf(typeInCollection, entityType))
                {
                    yield return typeInCollection;
                }
            }

            yield break;
        }