【问题标题】:looking a way to combine these methods in generic way on same return type寻找一种在相同返回类型上以通用方式组合这些方法的方法
【发布时间】:2020-01-21 22:09:11
【问题描述】:

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

以下是这些方法。

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

任何人都可以帮助我就如何以通用方式组合这些方法提出任何想法。我正在使用 Entity Framework Core。

【问题讨论】:

  • 老实说,我不会将这些结合起来。他们做不同的事情。为什么你认为这是必要的?

标签: c# .net list generics entity-framework-core


【解决方案1】:

EF DbContext 有一个.Set&lt;TDomain&gt;() 方法,它根据类型返回对象集。你可以从字面上写 -

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

UPDATE 因为它们是不同的属性。您可以注入一个表达式 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 子句就不会知道有这样名字的属性,但是由于这些都是通用的,将它们添加到接口应该不是问题..

【讨论】:

  • 是的,但它们也查询不同的属性,即s.AirflowSourceName
  • 您还可以将属性添加为 lambda。我会更新它。
  • 我相信你的意思是“字面上写”;)
  • @brainlesscoder 感谢您的建议,还有一个问题是我需要在 interface(IA) 中提及的属性是什么
  • 不是每个属性,只有你在方法中需要的一个。那里的界面只是举例。如果您要使用通用方法(第二种方法),则需要 CategorySpaceFunction 成为接口的一部分。我会更新答案以便更好地理解............更新了。
猜你喜欢
  • 2016-05-13
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多