2013-03-15 2 views
1

내 Entity Framework 컨텍스트에 대한 기본 crud 메서드를 정의하는 RepositoryBase 클래스가 있습니다. 나는 모든() 메소드의 두 가지 오버로드가 있습니다리포지토리 메서드의 형식 유추

public virtual IQueryable<T> All<TKey>(Expression<Func<T, bool>> predicate) 
{ 
    return All().Where(predicate); 
} 

public virtual PagedResult<T> All<TKey>(int startRowIndex, int maximumRows, 
    Expression<Func<T, TKey>> orderingKey, Expression<Func<T, bool>> predicate, 
    bool sortDescending = false) 
{ 
    var subset = All().Where(predicate); 

    IEnumerable<T> result = sortDescending 
           ? subset.OrderByDescending(orderingKey).Skip(startRowIndex).Take(maximumRows) 
           : subset.OrderBy(orderingKey).Skip(startRowIndex).Take(maximumRows); 

    //More code ommited 
} 

첫 번째 방법은 항상 날이 명시 적으로 개체 유형을 지정해야하지만 두 번째는하지 않습니다. 왜 이런거야?

return All(s => s.LoanApplicationId == loanApplicationId) 

을 대신 나는 다음과 같이 호출해야합니다 :

예,이 컴파일되지 않습니다

return All<LoanApplication>(s => s.LoanApplicationId == loanApplicationId) 

을하지만 이것은 컴파일 않습니다 :

return All(0,10, s => s.Name, s => s.LoanApplicationId == loanApplicationId, false) 

답변

2

TKey이에 두 번째 매개 변수 목록 (Expression<Func<T, TKey>> orderingKey을 통해)이 아니라 첫 번째. 이 함수는 두 번째 함수가 제공된 인수 (s => s.Name)와 함께 사용할 때 유형을 성공적으로 유추하기에 충분합니다. 첫 번째 버전에서는 고급 기능을 제공하지 않으므로 컴파일러에서 형식 매개 변수를 명시 적으로 제공하여 세부 정보를 채워야합니다.

그리고 그 모습에서 처음에는 TKey이 필요하지 않으므로 비교적 간단한 구현보다 더 많은 코드가 보이지 않는 한 그 코드를 제거 할 수 있습니다. 그리고 저는 여러분의 샘플 호출이 그것이 의미하는 바를 의미한다고 생각하지 않습니다. 두 번째 숫자가 TKey 인 경우 string (어떤 유형이든 s.Name)이 가능합니다.

관련 문제