EF DbContext имеет метод .Set<TDomain>()
, который возвращает набор объектов в зависимости от типа. Вы можете буквально написать -
public IQueryable<SpaceFunctionType> Get<TDomain>(string airFlowSource) where TDomain: IA
{
return _dbContext.Set<TDomain>().Where(s => s.EquipmentSourceName == airFlowSource)
.Select(c => new SpaceFunctionType
{
Category = c.Category,
SpaceFunction = c.SpaceFunction
});
}
Теперь, чтобы добавить общие функции, добавьте интерфейс -
public interface IA {
... AirflowSourceName
}
Из интерфейса -
public class A170: IA
{}
public class A621 : IA
{}
public class Equipments: IA
{}
подробнее https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbcontext.set?view=entity-framework-6.2.0
ОБНОВЛЕНИЕ Так как они имеют разные свойства. Вы можете ввести лямбда-выражение для сравнения .-
public IQueryable<SpaceFunctionType> Get<TDomain>(Expression<Func<TDomain, bool>> predicate) where TDomain: IA
{
return _dbContext.Set<TDomain>().Where(predicate)
.Select(c => new SpaceFunctionType
{
Category = c.Category,
SpaceFunction = c.SpaceFunction
});
}
и вызывать так -
.Get<A70>(x => x.AirflowSourceName == "forcename");
или
.Get<Equipments>(x => x.EquipmentSourceName == "forcename");
ОБНОВЛЕНИЕ 2
Необходимо обновить интерфейс как -
public interface IA {
... Category
... SpaceFunction
}
Без этого предложение Select
не будет знать, что существуют свойства с такими именами, но так как они являются общими добавление их в интерфейс не должно быть проблемой ..