2010-11-26 1 views
5

で動作します...それはのIQueryableにORDERBYを行います...しかし、私は1つが通常のIQueryable(非ジェネリックを)やってみたかったIQueryable(非汎用):カウントがスキップされ、スキップされますか?それは私が人は私を与えるために本当に便利でした拡張メソッドを持っているの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でも機能します。

回避策はありますか?私はGETPAGE非ジェネリックバージョンを削除しようとしたが、その後、私の非ジェネリックのIQueryableは」doesnの既存の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. 

にそうようにそれを呼び出す事前

EDIT

感謝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

ありがとうございます!あなたはC#4.0と言っています - 私は3.5を使っています。だから私は3.5で標準反射を使うことができますか?私は推測します? – Martin

+1

@Martin:はい。あなたは 'query'の具体的な型を取得し、それがどのインタフェースを実装しているかを調べる必要があります。それを介して' T'を見つけ、次に 'MethodInfo.MakeGenericMethod'を使って' Queryable.Count'などを呼び出す必要があります。非常に手早く乱雑になる。 –

+0

はい!ああ、うーん、考えてみよう:-)確認のためにありがとう。 – Martin

0

質問は古いですが、誰かがIQueryable拡張メソッドを必要とする場合は、戻り値の型が匿名の場合、IQueriableを返す必要があります。