Допустим, у меня есть класс Animal
, у которого есть несколько потомков, которые происходят от него, например Dog
Cat
и Mouse
public class Animal{}
public class Dog : Animal {}
public class Cat : Animal {}
public class Mouse: Animal {}
Теперь допустим, что объекты этих объектов хранятся вБаза данных SQL и что я использую Entity Framework для связи с этой базой данных.Собаки, кошки и мыши все хранятся в разных таблицах, но в коде у них один и тот же родительский элемент, от которого они происходят.
Если я хочу получить всех животных, которые соответствуют одному и тому же выражению, я бы запросил каждый DbSetотдельно и дать ему то же выражение, но с другим типом параметра, поэтому кошка получает тип параметра кошка, а собака получает параметр собаки, подобный этому
var cats = context.Cats.Where(p=>some expression);
var dogs= context.Dogs.Where(p=>some expression);
var mice= context.Mice.Where(p=>some expression);
var animals = new List<Animal>();
animals.AddRange(cats);
animals.AddRange(dogs);
animals.AddRange(mice);
Но это создает для меня проблему, потому чтоесли бы я захотел добавить другой тип животных, например Bird
, мне пришлось бы добавить еще одну строку кода, которая получает данные из базы данных и добавляет их в коллекцию результатов.Это поведение плохо управляемо, и я бы хотел, чтобы оно циклически проходило типы, производные от Animal
, и программно создавало выражение для правильного типа на основе предоставленного исходного выражения, которое передается в качестве параметра методу как выражение типа Animal
.Примерно так:
public List<Animal> GetAnimals(Expression<Func<Animal, bool>> expression)
{
var animalTypes = GetTypesDerivingFrom(typeof(Animal));
List<Animal> animals = new List<Animal>();
foreach(var animalType in animalTypes)
{
var typeTranslatedExpression = GetTypeTranslatedExpression(expression); //i dont know how to do this part
var portionOfAnimals = context.Set(animalType).Where(typeTranslatedExpression).ToList();
animals.AddRange(portionOfAnimals);
}
return animals;
}
Есть ли способ сделать это?Я думал об изменении типа параметра выражения, но я не могу понять это, не зная правильный тип параметра во время кода.