代码之家  ›  专栏  ›  技术社区  ›  Glory Raj

正在寻找一种在同一返回类型上以通用方式组合这些方法的方法

  •  0
  • Glory Raj  · 技术社区  · 6 年前

    我有以下三种方法,它们返回相同的返回类型,这三种方法之间的唯一区别是,数据是从不同的表中检索的。

    以下是这些方法。

    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
                              });
    }
    

    有谁能帮我提出一些关于如何以一种通用的方式结合这些方法的想法吗。我使用的是实体框架核心。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Glory Raj    6 年前

    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

    使现代化 因为它们是不同的属性。可以注入表达式lambda来进行比较-

    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 子句将不知道有这样的名称的属性,但由于这些名称对所有人都是通用的,所以将它们添加到接口中应该不会有问题。。