2010-11-26 11 views
5

i eine Verlängerung Methode haben, die eine Person war wirklich hilfreich, um zu mir ... es tut ein orderby auf IQueryable ... aber ich wollte man ein normales IQueryable (nicht generisch)IQueryable (nicht generisch): fehlende Anzahl und Überspringen? es funktioniert mit IQueryable <T>

zu tun Hier ist der Code, Der Count und Skip und ich denke Take fehlen.

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 
    } 

Hier ist das und es funktioniert einwandfrei keine Fehler.

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

Irgendwelche Ideen, wie ich das umgehen kann? Ich möchte meine Rückgabetypen nicht ändern, da es perfekt funktioniert, und ich habe eine andere Erweiterungsmethode namens ToDataTable und es funktioniert auch auf einem nicht generischen IQueryable.

Gibt es eine Arbeit um?

Vielen Dank im Voraus

EDIT

Ich nenne es wie so auf einer vorhandenen 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. 

Ich versuchte, die GetPage nicht generische Version zu entfernen, aber dann ‚mein nicht Generisches IQueryable doesn t Abholung der Erweiterung aufgrund der Tatsache, es ist kein Iqueryable aber nur ein IQeryable

Antwort

11

Wir ll, ganz einfach sind diese Methoden nicht verfügbar für IQueryable. Wenn Sie sich die Queryable methods anschauen, werden Sie sehen, dass sie fast alle auf IQueryable<T> basieren.

Wenn Ihre Datenquelle wirklich ein IQueryable<T> zur Ausführungszeit sein, und Sie wissen einfach nicht, was T ist, man dann könnte dass verwenden herausfinden, mit Reflexion ... oder in C# 4, dynamische Typisierung:

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

die dynamische Bit des # Compiler C wird für Sie von der Arbeit aus T zur Ausführungszeit kümmern.

Im Allgemeinen würde ich Sie jedoch ermutigen, einfach zu versuchen, die generische Form stattdessen überall zu verwenden - es wird wahrscheinlich wesentlich einfacher sein.

+0

Danke JOn! Sie sagen C# 4.0 - ich benutze 3.5 .. So kann ich eine Standard-Reflexion in 3.5 verwenden ?? ich nehme an? – Martin

+1

@Martin: Ja. Sie müssten den konkreten Typ von "query" ermitteln und herausfinden, welche Interfaces es implementiert ... finden Sie heraus, 'T' über das, dann' MethodInfo.MakeGenericMethod' zu nennen 'Queryable.Count' usw. Es ist wahrscheinlich sehr schnell chaotisch werden. –

+0

Ja !! Na gut, denke mal ... :-) Danke für die Bestätigung. – Martin

0

Die Frage ist alt, aber wenn jemand die IQueryable-Erweiterungsmethoden benötigt, sollte er/sie IQueriable zurückgeben, wenn der Rückgabetyp anonym ist.