webentwicklung-frage-antwort-db.com.de

Entity Framework-Bestellung umfasst

Ich versuche so etwas wie das Folgende zur Arbeit zu bringen:

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

BEARBEITEN:

Bei weiterer Beobachtung

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

erledigte den Job für mich (nach dem ersten Aufruf von Factory und ohne den Children.OrderBy).

33
Serj Sagan

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

Ähnliche Frage und Antwort hier

34
Olav Nybø

Die Erweiterungsmethode Includeist lediglich ein Wrapper um DbQuery.Include . Intern werden nicht die Ausdrücke ausgeführt, sondern nur parses, d. H. Sie nehmen ihre Member-Ausdrücke und konvertieren sie in einen Pfad als Zeichenfolge. Der Pfad wird als Eingabe für DbQuery.Include verwendet.

Es wurde zuvor angefordert, die Funktionalität von Include zu verbessern, z. um teilweise geladene Sammlungen zuzulassen, indem eine Where-Klausel eingefügt wird. Die Bestellung könnte eine weitere Änderungsanfrage sein. Aber wie Sie sehen, muss aufgrund der internen Arbeitsweise von Include der gesamte Mechanismus neu entwickelt werden, um solche Verbesserungen zu implementieren. Ich sehe es nicht auf der aktuellen Straßenkarte so kann es eine Weile dauern ...

11
Gert Arnold

Das wird niemals funktionieren. EF include ist der Versuch, alles zu verstehen und in SQL zu übersetzen, aber Sie möchten zu viel davon. Laden Sie alle Entitäten ohne Sortierung und .ToList () --ing und schreiben Sie eine Erweiterungsmethode für IEnumerable, um ein geordnetes Ergebnis zu erhalten.

1
Peter Kiss

Wenn Sie eine Reihe von Includes verwenden, müssen Sie normalerweise auf untergeordnete Eigenschaften in einer Ansicht zugreifen. Was ich mache, ist, die Kindersammlung zu bestellen, wenn ich in einer Ansicht darauf zugreifen muss.

Beispielsweise könnte ich einige Include-Anweisungen für ein Master/Detail-Formular erstellen. Es macht keinen Sinn, dies bei der ersten EF-Abfrage zu ordnen. Warum ordnen Sie diese untergeordneten Datensätze nicht auf Ansichtsebene an, wenn Sie tatsächlich darauf zugreifen?

Ich habe möglicherweise eine Umfrage mit mehreren Umfragefragen. Wenn ich die Fragen in einer bestimmten Reihenfolge darstellen möchte, mache ich dies auf der Ebene der Teilansicht, wenn ich die Modellkindersammlung an die Teilansicht weitergebe.

@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x => 
x.QuestionId))
0
Charles Owen

Ich benutze diesen Code von order das Include, benutze ein select und eine Funktion, um die Collection zu bestellen . Ist nicht das Beste, funktioniert aber gut, wenn die Subcollection klein ist

   // GET: api/Tareas
    [HttpGet]
    public IEnumerable<Tarea> GetTareas()
    {
        var result = _context.Tareas
            .Include(p => p.SubTareas)
            .Select(p => SortInclude(p));
        return result;
    }

    private Tarea SortInclude(Tarea p)
    {
        p.SubTareas = (p.SubTareas as HashSet<SubTarea>)?
            .OrderBy(s => s.Position)
            .ToHashSet<SubTarea>();
        return p;
    }
0
FRL

Je nach Anwendungsfall müssen Sie möglicherweise nicht in einer separaten Abfrage laden oder danach sortieren.

In meinem Fall brauchte ich sie, wenn ich in der Ansicht eine Schleife machte, also habe ich sie dort bestellt

@foreach (var subObject in Object.SubObjects.OrderBy(x=>x.Order))
0