2010-11-26 5 views
5

내가이 된 IQueryable에 ORDERBY을한다 ... 사람이 내게 줄 정말 도움이되었다 확장 방법이 ...하지만 난 (비 제네릭)IQueryable (일반) : 누락 및 건너 뛰기? 그것은 된 IQueryable 작동 <T>

정상적인 된 IQueryable을 할 하나를 원했다 여기에 코드, 카운트 및 건너 뛰기가 있으며 테이크가 누락 된 것 같습니다.

public static IQueryable GetPage(this IQueryable query, 
     int page, int pageSize, out int count) 
    { 
     int skip = (int)((page - 1) * pageSize); 

     count = query.Count(); //COUNT DOESN'T EXIST 
     return query.Skip(skip).Take((int)pageSize); // NEITHER SKIP 
    } 

여기는 완벽하게 오류없이 작동합니다.

public static IQueryable<T> GetPage<T>(this IQueryable<T> query, 
     int page, int pageSize, out int count) 
    { 
     int skip = (int)((page - 1) * pageSize); 

     count = query.Count(); 
     return query.Skip(skip).Take((int)pageSize); 
    } 

어떤 아이디어가이 문제를 해결할 수 있습니까? 내 반환 형식을 완벽하게 작동하고 ToDataTable이라는 또 다른 확장 메서드가 있고 또한 일반 범용 IQueryable에서 함수를 변경하고 싶지 않습니다.

해결 방법이 있습니까? 사전에

감사

편집

나는 기존에 IQueryable

IQueryable<Client> gen = null; 
IQueryable nongen = null; 

var test = gen.GetPage(); //COMPILES! 

var test 1 = non.GetPage(); // Doesn't compile because GETPAGE 
          // for non generic is broken as it has 
          // invalid methods like COUNT and SKIP etc. 

나는 GetPage이 아닌 일반 버전을 제거하려고하지만 내 비 일반에 IQueryable은 '아무튼에 지금과 같이 호출 픽업은 Iqueryable이 아니라 IQueryable만으로 확장됩니다.

답변

11

We 이 방법은 IQueryable에 사용할 수 없습니다. Queryable methods을 보면 거의 모두 IQueryable<T>을 기반으로합니다.

하는 데이터 소스가 정말가 실행 시간에 IQueryable<T> 될 것입니다, 당신은 단지 T가 무엇인지 모른다면, 당신은 단지 사용, 반사와 그것을 알아 ... 나 C# 4의 수 동적 타이핑 :

public static IQueryable GetPage(this IQueryable query, 
    int page, int pageSize, out int count) 
{ 
    int skip = (int)((page - 1) * pageSize); 
    dynamic dynamicQuery = query; 
    count = Queryable.Count(dynamicQuery); 
    return Queryable.Take(Queryable.Skip(dynamicQuery, skip), pageSize); 
} 

C# 컴파일러의 동적 비트는 실행 시간에 당신을 위해 T을 작업 처리됩니다.

그러나 일반적으로 어디서나 일반 양식을 사용하는 것이 좋습니다. 상당히 간단 할 것 같습니다.

+0

Thanks JOn! 당신은 C# 4.0 상태 - 3.5를 사용하고 있습니다. 그래서 3.5에서 표준 반사를 사용할 수 있습니까 ?? 나는 추정한다? – Martin

+1

@ Martin : 네. 당신은 구체적인 유형의'query'를 얻고 그것이 구현하는 인터페이스를 찾아야합니다 ... 그것을 통해'T'를 찾아낸 다음'MethodInfo.MakeGenericMethod'를 사용하여'Queryable.Count' 등을 호출해야합니다. 매우 지저분 해지다. –

+0

예! 오 잘 생각을 가질거야 :-) 확인을위한 감사합니다. – Martin

0

질문은 오래되었지만 누군가가 IQueryable 확장 메서드를 필요로하는 경우 반환 형식이 익명 인 경우 IQueriable을 반환해야합니다.