泛化冗余代码

本文关键字:代码 冗余 泛化 | 更新日期: 2023-09-27 18:15:27

假设我有一个具有多个可空外键的表。

在我的业务逻辑中,我必须为每种情况编写不同的查询,因为每次外键条件都不同,如下所示:

var q1 = 
    from c in container.Stuff
    where c.fk1 = pk1id
    select c;
var q2 = 
    from c in container.Stuff
    where c.fk2 = pk2id
    select c;

等等,这意味着大量的代码重复和许多额外的东西需要考虑(在这个表中有10个这样的fks),所以有40个{C,R,U,D}方法需要跟踪,在源代码的不同分支中。

除此之外,这在多个表中重复,并且会创建一个维护噩梦。

我在想,有没有什么方法可以概括这一点?有没有办法使这些查询更动态?如果有,我应该从哪里开始找呢?我不认为泛型适合这里,所以有没有其他的结构使它更抽象?

为了使其更具体,一些类似pseudo的代码使其更具体…

List<Stuff> ReadStuff(Type owningEntityType, int fkId)
{
     // Now I would somehow have to infer (perhaps by adding more info to the method signature) what column to put the where clause on and create an EF query based on that...
     // So how would I go from owningEntityType (or some textual description), to a 'real' field


 }

泛化冗余代码

这个呢:

public IQueryable<T> GenerateResultSet<T>(
       Expression<Func<T, bool>> predicate) where T : BaseEntity
{
   return dbContext.Set<T>().Where(predicate);
}

你可以这样使用:

var q1 = GenerateResultSet<Stuff>(c => c.fk1 == pkId);
var q2 = GenerateResultSet<Stuff2>(c => c.fk2 == pkId2);