2013-03-13 22 views
24

Ich versuche, so etwas wie die Arbeit folgende zu erhalten:Entity Framework Bestellung Enthält

_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(); 

Der Teil, der die Ausnahme verursacht, ist:

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

EDIT:

Upon weitere Beobachtung,

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

hat die Arbeit für mich (nach der ersten Factory Anruf und ohne die Children.OrderBy).

+0

Dank für die Bereitstellung der Antwort, die Sie für mich gearbeitet Ergebnis als gut – Ronan

Antwort

26

Es scheint, dass Sie die untergeordnete Auflistung in Ihrer Abfrage nicht sortieren können. Sortieren Sie entweder nach der Abfrage oder laden Sie die untergeordneten Elemente in einer zweiten Abfrage.

ähnliche Frage und Antwort here

+0

ich Ihnen den Kredit gegeben haben, weil Sie die erste und alle drei Antworten zu beantworten waren ziemlich dasselbe sagen –

+0

Stimmt das immer noch mit EF Version 6.0? – Brad8118

1

Das wird nie gona Arbeit. EF include ist versuchen, alles zu SQL zu verstehen und zu übersetzen, aber Sie wollen zu viel davon. Laden Sie alle Entitäten ohne Sortieren und .ToList() - ing, und schreiben Sie eine Erweiterungsmethode für IEnumerable, um ein geordnetes Ergebnis zu erhalten.

11

Die Erweiterungsmethode Include ist ein reiner Wrapper um DbQuery.Include. Intern führt die Ausdrücke nicht aus, sondern nur analysiert sie, d. H. Es nimmt ihre Mitgliedsausdrücke und wandelt sie in einen Pfad als Zeichenfolge um. Der Pfad wird als Eingabe für DbQuery.Include verwendet.

Es wurde zuvor gefordert, die Funktionalität von Include, z.B. um teilweise geladene Sammlungen zuzulassen, indem eine Klausel Where eingefügt wird. Bestellung könnte eine andere Änderungsanfrage sein. Aber wie Sie sehen, muss wegen der internen Arbeitsweise von Include der gesamte Mechanismus neu entwickelt werden, um solche Verbesserungen zu implementieren. Ich sehe es nicht auf der aktuellen road map so kann es eine Weile dauern ...

-2

Sie sollten keine IQueryable Typ IEnumerable konvertieren und rufen Include weil Include nicht durch IEnumerable Typ unterstützt wird.

Kurz gesagt, rufen nie Fügen Sie nach ToList

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

Ihr Punkt ist wahr, aber es hat nichts mit der Frage zu tun, die gestellt wird. Ich versuche das 'Include' vor der' ToList' zu machen –