2013-03-13 15 views
24

Próbuję dostać coś takiego do pliku działa:Entity Framework Kolejność Zawiera

_dbmsParentSections = FactoryTools.Factory.PdfSections 
         .Include(x => x.Children.OrderBy(y => y.Order).ToList()) 
         .Include(x => x.Hint).Include(x => x.Fields) 
         .Where(x => x.FormId == FormId && x.Parent == null) 
         .OrderBy(o => o.Order) 
         .ToList(); 

część, która powoduje, że wyjątek jest:

.Include(x => x.Children.OrderBy(y => y.Order).ToList()) 

EDIT:

Upon dalsze obserwacje,

_dbmsParentSections.ForEach(x => x.Children = x.Children.OrderBy(y => y.Order).ToList()); 

nie praca dla mnie (po początkowym Factory wezwanie i bez Children.OrderBy).

+0

Dzięki za dostarczenie odpowiedzi znalazłeś pracował dla mnie aswell – Ronan

Odpowiedz

26

Wydaje się, że nie można sortować kolekcję dzieci w zapytaniu. Albo sortuj po zapytaniu, albo załaduj dzieci w drugim zapytaniu.

Podobne pytanie i odpowiedzieć here

+0

Dałem ci kredytu, bo byłeś pierwszy odpowiedzieć na wszystkie trzy odpowiedzi dość dużo powiedzieć to samo –

+0

Czy to nadal prawda w wersji EF 6.0? – Brad8118

1

będzie to praca nigdy gona. EF to próba zrozumienia i przetłumaczenia wszystkiego na SQL, ale bardzo na tym zależy. Załaduj wszystkie jednostki bez sortowania i .ToList() - i zapisz metodę rozszerzenia dla IEnumerable, aby uzyskać uporządkowany wynik.

11

Metoda rozszerzenia Include to zwykłe opakowanie o numerze DbQuery.Include. Wewnętrznie nie ma wykonać wyrażenia ale tylko analizuje je, to znaczy wykonuje swoje wyrażeń członków i konwertuje je do ścieżki jako ciąg. Ścieżka jest używana jako dane wejściowe dla DbQuery.Include.

wniosek złożono wcześniej, aby zwiększyć funkcjonalność Include np aby umożliwić częściowo załadowane kolekcje, włączając klauzulę Where. Kolejność może być kolejną prośbą o zmianę. Ale jak widzisz, z powodu wewnętrznego działania Include, cały mechanizm będzie musiał zostać przeprojektowany w celu wdrożenia takich ulepszeń. Nie widzę go na obecnym road map więc może trochę potrwać ...

-2

Nie należy przekonwertować typ IQueryable do IEnumerable i nazywają Include ponieważ Include nie jest obsługiwany przez IEnumerable typu.

Krótko mówiąc, nigdy nazywamy Dołącz po ToList

IQueryable = server side call (SQL) 
IEnumerable = client side (loaded in memory) 
+0

Twoja uwaga jest prawdziwa, ale nie ma nic wspólnego z pytaniem. Próbuję wykonać 'Include' przed' ToList' –