2009-12-14 50 views
0

我使用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。

回答

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,請在列表中顯示結果後執行此操作。