2013-08-02 10 views
6

mio LINQ è qualcosaOrderByDescending con Skip e Take a LINQ mostra errore

GetPublishedArticleList().Where(x => x.Category.CatName == catName).OrderByDescending(x=>x.PublishedDate).Skip(skip).Take(last); 

sto ottenendo seguente eccezione quando il codice di cui sopra viene eseguito

"Il metodo 'Skip' è supportato solo per l'ingresso ordinato in LINQ su Entities Il metodo 'OrderBy' deve essere chiamato prima del metodo 'Skip'.

Bene, voglio che LINQ capisca che ho bisogno di ordinare i dati in ordine decrescente e poi applicare Skip and Take. (bene il codice sopra funziona quando OrderByDescending è sostituito da O rderBy)

Qualcuno può suggerirmi un'alternativa?

+0

Potresti chiamare prima? Questo ti restituirà un oggetto IEnumerable (da un IOrderedQueryable) sul quale puoi chiamare Skip. Se ciò causerà problemi con i tuoi dati, potresti cambiarlo in "Take (saltare + ultima) .Skip (salta)" – John

+0

Wow - è davvero strano. Sembra * un bug per me ... –

+3

@John: No, chiamare 'Take' per prima cosa interromperà i risultati ... e il punto è che qui abbiamo un 'IOrderedQueryable', non un' IOrderedEnumerable' - stiamo cercando di ridurre la quantità di dati trasferiti dal database. –

risposta

1

Questo funziona con EF5. (.net 4.5) Non riesco a vedere nulla di sbagliato nel codice. Sei sicuro di aver avuto correttamente la sequenza del metodo durante il test? Il tipo di origine era Iqueryable o Iqueryable?

public virtual IQueryable<TPoco> GetSortedPageList<TSortKey>(Expression<Func<TPoco, bool>> predicate, 
     Expression<Func<TPoco, TSortKey>> sortBy, 
     bool descending, 
     int skipRecords, int takeRecords) { 
     if (!descending) { 
      return Context.Set<TPoco>() 
       .Where<TPoco> predicate) 
       .OrderBy(sortBy) 
       .Skip(skipRecords) 
       .Take(takeRecords); 
     } 
     return 
      Context.Set<TPoco>() 
       .Where<TPoco>(predicate) 
       .OrderByDescending(sortBy) 
       .Skip(skipRecords) 
       .Take(takeRecords); 
    } 
+0

il tipo di origine è IQueryable. sì, la sequenza del metodo è corretta alla mia fine. Ho anche EF5. questo è molto strano –

+0

Questa è una preoccupazione. Ho appena scritto un test per far funzionare la discesa. Lo ha fatto. Ma sono preoccupato che ci sia un problema da qualche parte. Non hai fatto caso quando hai eseguito il test, hai creato l'elenco con distinti o di gruppo? Sto cercando di immaginare perché potrebbe fallire. lottando .... –

+0

ho trovato 2 problemi uno con EF dll non riferimento correttamente e stavo applicando Where clausola 2 volte. Ora è stato aggiornato EF da Nuget e sono state unite le due clausole Where da 2 posizioni diverse (metodi child diversi) a uno. –

Problemi correlati