使用通用谓词的实体框架

问题描述:

我使用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查询中的.WHER子句不能从使用中推断出来。如果我在Expression中使用具体类型,那么它可以找到,但我不想直接将我的业务层展示给EF。

尝试制作使用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,请在列表中显示结果后执行此操作。