推广冗余代码

时间:2014-07-30 07:52:16

标签: c# entity-framework

假设我有一个包含多个可以为空的外键的表。

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

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}方法可以跟踪,来源的不同分支。

此外,在多个表中重复这一事实并创建维护噩梦。

我在想,有什么方法可以概括这个吗?有没有办法让这些查询更具动态性?如果是这样,我应该从哪里开始寻找?我真的没有看到泛型适合这里,所以是否有其他一些结构使这更抽象?

为了使这个更具体,一些类似psuedo的代码使这更具体......

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




 }

1 个答案:

答案 0 :(得分:2)

这个怎么样:

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