2010-11-26 51 views
5

我有一個擴展方法,其中一人是真正有用的給我......它在IQueryable的一個排序依據......但我想一個做一個正常的IQueryable(非通用)IQueryable(非泛型):缺少Count和Skip?它的工作原理與IQueryable的<T>

這裏是代碼,計數和跳過,我認爲失去了。

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

我們很簡單,這些方法不適用於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

謝謝JOn!你聲明c#4.0 - 我使用3.5 ..所以我可以在3.5中使用標準反射?我相信? – Martin 2010-11-26 13:26:11

0

問題是舊的,但當有人需要IQueryable擴展方法,那麼當返回類型是匿名時,他/她應該返回IQueriable。