使用Generic Predicates的实体框架

时间:2009-12-14 06:13:43

标签: entity-framework lambda repository-pattern

我使用DTO通过存储库模式在我的业务和实体框架层之间进行映射。

标准通话看起来像

public IClassDTO Fetch(Guid id)
{
    var query = from s in _db.Base.OfType<Class>()
        where s.ID == id
        select s;

    return query.First();
}

现在我希望从业务层传递过滤条件,所以我尝试了

public IEnumerable<IClassDTO> FetchAll(ISpecification<IClassDTO> whereclause)
{            
    var query = _db.Base.OfType<Class>()
        .AsExpandable()
        .Where(whereclause.EvalPredicate);      

    return query.ToList().Cast<IClassDTO>(); 
}

来自业务层的呼叫类似于

Specification<IClassDTO> school =
    new Specification<IClassDTO>(s => s.School.ID == _schoolGuid);

IEnumerable<IClassDTO> testclasses = _db.FetchAll(school);

我遇到的问题是无法从使用中推断出EF查询中的.Where子句。如果我在Expression中使用具体类型,那么它可以找到但我不想直接将我的业务层公开给EF。

1 个答案:

答案 0 :(得分:0)

尝试将FetchAll转换为类的泛型,如下所示: -

public IEnumerable<T> FetchAll<T> (Expression<Func<T,bool>> wherePredicate)
  where T:IClassDTO  //not actually needed
{            
    var query = _db.Base.OfType<T>()
        .AsExpandable()
        .Where(wherePredicate);      

    return query; 
}

传递school.Evalpredicate insteadFetchAll似乎不需要了解整个规范,它只需要谓词,对吗?如果您需要将其强制转换为IClassDTO,请在将结果放入列表后执行此操作。