泛化冗余代码
本文关键字:代码 冗余 泛化 | 更新日期: 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);