2013-10-06 4 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); 
} 
관련 문제