Вы можете использовать следующий подход, но будьте осторожны, так как этот подход с нетерпением загружает всех животных и может не подойти лучше всего для всех ваших случаев.
public IEnumerable<IAnimal> GetAllAnimals()
{
List<IAnimal> allAnimals = GetAllEntriesByEntityInterface<IAnimal>();
return allAnimals;
}
Метод объединения всех прав в одном списке
private List<T> GetAllEntries<T>() where T : class
{
List<IQueryable<T>> sets = typeof(T).IsInterface ? GetAllSetsByInterface<T>() : GetAllSetsByBaseClass<T>();
List<T> allEntries = new List<T>();
foreach (var item in sets)
{
allEntries.AddRange(item.ToList());
}
return allEntries;
}
Здесь мы получаем все Наборы сущностей, реализующие обобщенный c класс T. Этот метод может быть полезен, если вы нужно работать с интерфейсами.
private List<IQueryable<T>> GetAllSetsByInterface<T>() where T : class
{
var types = context.Model.GetEntityTypes().Select(t => t.ClrType).ToList().Where(t => t.GetInterfaces().Any(i => i == typeof(T))).ToList();
var sets = types.Select(type =>
context.GetType()
.GetMethod("Set")
.MakeGenericMethod(type)
.Invoke(context, null)
as IQueryable<T>
).ToList();
return sets;
}
И метод извлечения всех наборов сущностей, полученных из обобщенного c класса T
private List<IQueryable<T>> GetAllSetsByBaseClass<T>() where T : class
{
var types = context.Model.GetEntityTypes().Select(t => t.ClrType).Where(x => x.IsSubclassOf(typeof(T))).ToList();
var sets = types.Select(type =>
context.GetType()
.GetMethod("Set")
.MakeGenericMethod(type)
.Invoke(context, null)
as IQueryable<T>
).ToList();
return sets;
}