2013-08-02 7 views
6

Moje LINQ jest cośOrderByDescending z wyboru i podjąć w LINQ pokazuje błąd

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

otrzymuję następujący wyjątek, gdy powyższy kod jest uruchamiany

„Metoda«Skip»jest obsługiwana tylko dla wejścia segregowanych Metoda "OrderBy" musi zostać wywołana przed metodą "Pomiń"

Chcę, aby LINQ zrozumiał, że najpierw muszę zamówić dane w porządku malejącym, a następnie zastosować Skip i Take. (cóż powyższy kod działa, gdy OrderByDescending jest zamieniany na O rderBy)

Czy ktoś może zaproponować mi alternatywę?

+0

Czy możesz zadzwonić Najpierw? To zwróci ci IEnumerable (z IOrderedQueryable), na który możesz zadzwonić Skip. Jeśli to zepsułoby twoje oznaczenia, możesz zmienić je na 'Take (skip + last) .Skip (pomiń)' – John

+0

Wow - to naprawdę dziwne. To * brzmi * jak błąd dla mnie ... –

+3

@John: Nie, wywołanie 'Take' na początku mogłoby złamać wyniki ... i chodzi o to, że mamy tutaj' IOrderedQueryable', a nie 'IOrderedEnumerable' - próbujemy zmniejszyć ilość danych przesyłanych z bazy danych. –

Odpowiedz

1

Działa z EF5. (.net 4.5) Nie widzę niczego nie tak z twoim kodem. Czy jesteś pewien, że podczas testowania miałeś właściwą sekwencję metod? Czy typ źródła był Iqueryable lub 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

Typem źródła jest IQueryable. tak, sekwencja metody jest poprawna na moim końcu. Mam też EF5. To jest bardzo dziwne. –

+0

To jest problem. Właśnie napisałem test, aby zejście zadziałało. Tak było. Ale martwię się, że gdzieś jest problem. Nie zrobiłeś tego przypadkowo, gdy przeprowadziłeś test, czy lista została zbudowana z odrębną grupą? Próbuję wymyślić, dlaczego może się nie udać. walczyłem .... –

+0

znalazłem 2 numery jeden z biblioteki DLL EF nie odwołuje się właściwie i ja stosowałem klauzulę Where 2 razy. Teraz zaktualizowano EF z Nuget i połączyłem te 2 klauzule Where z 2 różnych miejsc (różnych metod potomnych) z jednym. –

Powiązane problemy