2010-11-26 17 views
5

tengo un método de extensión, que era una persona muy útil para mí dar ... lo hace un OrdenarPor en IQueryable ... pero yo quería uno para hacer un IQueryable normal (no genérico)IQueryable (no genérico): ¿falta Count and Skip? funciona con IQueryable <T>

Aquí está el código, The count y Skip, y creo que Take está perdido.

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 
    } 

Aquí está el y funciona perfectamente sin errores.

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); 
    } 

¿Alguna idea de cómo puedo evitar esto? No quiero cambiar mis tipos de devolución ya que funciona perfectamente y tengo otro método de extensión llamado ToDataTable y también funciona en un IQueryable no genérico.

¿Hay un problema?

Gracias de antemano

EDITAR

llamo al igual que en una ya existente 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. 

I intentado quitar la versión getPage no genérico, pero entonces mi no IQueryable Genérico doesn' t Recoge la extensión debido a que no es un Iqueryable sino solo un IQueryable

Respuesta

11

Nosotros ll, simplemente esos métodos no están disponibles para IQueryable. Si nos fijamos en el Queryable methods verá que casi todos están basados ​​en IQueryable<T>.

Si su fuente de datos será muy ser un IQueryable<T> en tiempo de ejecución, y que simplemente no saben lo que es T, entonces usted podría encuentra que con la reflexión ... o en C# 4, sólo tiene que utilizar tipado dinámico:

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); 
} 

el bit dinámica del compilador de C# se encargará de la elaboración de T para que en tiempo de ejecución.

En general, le recomiendo que simplemente trate de usar el formulario genérico en todas partes en su lugar, es probable que sea significativamente más simple.

+0

Gracias JOn! Usted declara C# 4.0 - estoy usando 3.5 ... ¿Puedo usar un reflejo estándar en 3.5? ¿Supongo? – Martin

+1

@Martin: Sí. Tendría que obtener el tipo concreto de 'query' y descubrir qué interfaces implementa ... descubra' T' a través de eso, luego use 'MethodInfo.MakeGenericMethod' para llamar' Queryable.Count' etc. Es probable que desordenarse muy rápido –

+0

¡Sí! ah bien voy a pensar ... :-) Gracias por la confirmación. – Martin

0

La pregunta es antigua, pero cuando alguien necesita los métodos de extensión IQueryable, entonces debe devolver IQueriable cuando el tipo de devolución es anónimo.