2013-10-06 111 views
0

有一個通用的存儲庫,工作正常。該庫有2個構造函數:如何檢查項目匹配謂詞

private IDbSet<T> mDbSet; 
    private Expression<Func<T, bool>> mPredicate; 
    ... 

    public Repository() 
    { 
     mDbSet = mDb.Set<T>(); 
     mPredicate = null; 
    } 

    public Repository(Expression<Func<T, bool>> predicate) 
    { 
     mDbSet = mDb.Set<T>(); 
     mPredicate = predicate; 
    } 

第二個爲存儲庫中的項目提供「標準」過濾器。該過濾器適用於輸出以及輸入。所以Add函數需要檢查元素是否與謂詞匹配。怎麼做。以下不編譯:

public virtual void Add(ref T item) 
{ 
    if (mPredicate != null) 
    { 
     List<T> chkList = new List<T>() { item }; 

     if (chkList.FirstOrDefault(mPredicate) == null) 
     { 
      throw new AppExcpetion("Add non-matching element."); 
     } 
    } 

    mDbSet.Add(item); 
} 

FirstOrDefault適用於非通用列表。但也許我不需要列表來檢查項目是否與謂詞匹配。預先感謝任何幫助!

+0

'如果(mPredicate! = null &&!mPredicate(item)){拋出新的AppException ...}'? –

回答

2

首先,你必須編譯表達式來使用它來檢查。這將是可能是最好的,而不是存儲的編譯功能重新編譯它Add

private readonly Expression<Func<T, bool>> mPredicate; 
private readonly Func<T, bool> predicate; 

public Repository(Expression<Func<T, bool>> predicate) 
{ 
    mDbSet = mDb.Set<T>(); 
    mPredicate = predicate; 
    this.predicate = mPredicate.Compile(); 
} 

而且ref是不是在參數必要(或需要):

public virtual void Add(T item) 
{ 
    if (predicate != null && !predicate(item)) 
    {   
     throw new AppExcpetion("Add non-matching element."); 
    } 
    mDbSet.Add(item); 
}