5 Stimmen

Die Implementierung von List<T> verliert die Reihenfolge der ursprünglichen Abfrage.

Mit Entity Framework habe ich ein IQueryable für ein Datenbankobjekt Meeting und e ist der DbContext.

IQueryable meetings = e.Meetings
    .Include(m => m.MeetingStage)
    .Include(m => m.MeetingType)

Dieser Abfrage wurde OrderBy angewendet.

Dann möchte ich aus dieser Abfrage in ein neues Objekt MeetingSearchResult auswählen. Allerdings stelle ich fest, dass in bestimmten Fällen die Reihenfolge geändert wird, wie diese Tests zeigen

var temp2 = sortedMeetings.Select(m => m.MeetingID);

System.Diagnostics.Debug.WriteLine(string.Join(" / ", temp2.ToList().ToArray()));

var temp4 = sortedMeetings.Select(m => new MeetingSearchResult()
{
       MeetingID = m.MeetingID,
       CompanyName = m.CompanyName
});

System.Diagnostics.Debug.WriteLine(string.Join(" / ", temp4.ToList().Select(m => m.MeetingID).ToArray()));

var temp8 = sortedMeetings.Select(m => new MeetingSearchResult()
{
      MeetingID = m.MeetingID,
      CompanyName = m.CompanyName,
      MeetingDate = m.MeetingDate,
      MeetingStage = m.MeetingStage.Description
});

System.Diagnostics.Debug.WriteLine(string.Join(" / ", temp8.ToList().Select(m => m.MeetingID).ToArray()));

Die Ausgabe der Debuggers hier ist:

2493 / 4228 / 7029 / 8254 / 9375 / 10563 / 11716 / 10500
2493 / 4228 / 7029 / 8254 / 9375 / 10563 / 11716 / 10500
2493 / 4228 / 7029 / 8254 / 9375 / 10500 / 10563 / 11716

Die Reihenfolge der Objekte in temp8 hat sich geändert. Kann jemand das erklären?

Weitere Informationen:

Leute haben nach mehr Informationen darüber gefragt, was sortedMeetings ist.

var sortedMeetings = meetings.DoMeetingSort(sort, ascending);

Meine Erweiterung DoMeetingSort folgt. Ich habe die switch cases entfernt, die hier nicht zutreffen:

    public static IQueryable DoMeetingSort(this IQueryable query, Constants.MeetingSortColumn column, bool ascending)
    {
        switch (column)
        {
            case Constants.MeetingSortColumn.MeetingType:
                return ascending
                    ? query.OrderBy(m => m.MeetingType.Description).ThenBy(m => m.MeetingDate).ThenBy(m => m.CompanyName)
                    : query.OrderByDescending(m => m.MeetingType.Description).ThenByDescending(m => m.MeetingDate).ThenByDescending(m => m.CompanyName);
        }
    }

1voto

saamorim Punkte 3855

Es gibt viele Gründe, warum dies passieren kann, aber aus Ihrem Beispiel ist die wahrscheinlichste Ursache, dass die zugrunde liegende Datenbank dies entscheidet. Ich vermute, dass Ihr sortedMeetings immer noch ein IQueryable ist und die Abfrage daher immer noch konstruiert wird. Da Sie zusätzliche Spalten einschließen und ToList() aufrufen, werden verschiedene Abfragen an Ihren db-Motor gerichtet, und er kann entscheiden, einen anderen Index oder einfach einen anderen Pfad für Ihre Abfrage zu verwenden. Wenn Sie Sql Server verwenden, profilieren Sie Ihre Abfrage und sehen Sie den Ausführungsplan ein, verwenden Sie dennoch ein order by in dem, was Sie wollen, das ist Ihre einzige Sicherheit.

Präsentieren Sie jedoch die sortedMeetings mit dem OrderBy für eine vollständige Analyse.

BEARBEITEN:

Außerdem scheint es, dass der Ursprung IQueryable nicht derselbe ist: temp2 abgeleitet von sortedMeetings, temp4 und temp8 von temp. Wenn Sie EF6 verwenden, verwenden Sie context.Database.Log, um Ihre Abfragen abzurufen, verwenden Sie andernfalls ein Datenbankprofilierungstool. Posten Sie die Datenbankabfragen hier und wir helfen Ihnen dabei, sie zu analysieren.

0voto

Tom Troughton Punkte 3609

Ich habe die Antwort gefunden. Das MeetingSearchResult-Objekt, das ich zurückgegeben habe, enthielt keine Eigenschaft, die die sortierte Spalte repräsentierte, sodass diese Spalte nicht in der Datenbankabfrage enthalten war. Offensichtlich, aber das hat mich tagelang verwirrt. Erklärt auch, warum das Sortieren nach anderen Spalten gut funktioniert hat.

+1 an @saamorim für das Agieren als frischen Blick und mich auf context.Database.Log hinzuweisen, von dem ich nichts wusste.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X