ищет способ объединить эти методы в общем c способе на тот же тип возврата - PullRequest
0 голосов
/ 22 января 2020

У меня есть три метода ниже, и они возвращают один и тот же тип возврата, и единственное различие между этими тремя методами состоит в том, что данные извлекаются из разных таблиц.

Ниже приведены эти методы.

public IQueryable<SpaceFunctionType> GetSpaceFunctionForA170(string airFlowSource)
{
    return _dbContext.A170.Where(s => s.AirflowSourceName == airFlowSource)
                          .Select(c => new SpaceFunctionType
                          {
                              Category = c.Category,
                              SpaceFunction = c.SpaceFunction
                          });
}

public IQueryable<SpaceFunctionType> GetSpaceFunctionForA621(string airFlowSource)
{
    return _dbContext.A621.Where(s => s.AirflowSourceName == airFlowSource)
                          .Select(c => new SpaceFunctionType
                          {
                              Category = c.Category,
                              SpaceFunction = c.SpaceFunction
                          });
}

public IQueryable<SpaceFunctionType> GetSpaceFunctionForEquipment(string airFlowSource)
{
    return _dbContext.Equipments.Where(s => s.EquipmentSourceName == airFlowSource)
                          .Select(c => new SpaceFunctionType
                          {
                              Category = c.Category,
                              SpaceFunction = c.SpaceFunction
                          });
}

Может ли кто-нибудь помочь мне предложить какие-либо идеи относительно того, как объединить эти методы в общем c способе. Я использую Entity Framework Core.

1 Ответ

2 голосов
/ 22 января 2020

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 не будет знать, что существуют свойства с такими именами, но так как они являются общими добавление их в интерфейс не должно быть проблемой ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...