8 Stimmen

Wie löse ich "Die Methode 'Skip' wird nur für sortierte Eingaben in LINQ to Entities unterstützt."

Ich habe diesen Fehler bekommen, als ich "LINQ to Entities" benutzt habe, um jedes einzelne Produkt anzuzeigen und Paging in ASP.NET MVC zu implementieren.:

Die Methode 'Skip' wird nur für sortierte Eingaben in LINQ to Entities unterstützt.
Die Methode 'OrderBy' muss vor der Methode 'Skip' aufgerufen werden."

LINQ:

Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
                        .Skip((page - 1) * pageSize)
                        .Take(pageSize)
                        .ToList();

Wie kann ich das beheben? Was würde passieren, wenn ich OrderBy anstelle von Where verwenden würde?

23voto

Simon Whitehead Punkte 60375

Sie setzen nicht einfach OrderBy anstelle von Where...sie werden kombiniert:

Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
                        .OrderBy(p => p.ProductSubcategoryID) // <---- das
                        .Skip((page - 1) * pageSize)
                        .Take(pageSize)
                        .ToList();

Dies ist erforderlich, weil der generierte SQL etwas wie folgt erzeugen wird:

WHERE generated_id BETWEEN x AND y

Wenn Sie dem DB-Server nicht explizit mitteilen, in welcher Reihenfolge die Ergebnisse zurückgegeben werden sollen...werden Ihre Ergebnisse jedes Mal unterschiedlich sein. Wenn Sie jedoch nach einem Feld ordnen, sind sie garantiert in der richtigen Reihenfolge und daher erzeugt Ihr Paging konsistente Ergebnisse.

2voto

Xudong Jin Punkte 89

Sie können ".OrderBy(i => 0)" hinzufügen, um die Beschränkung zu umgehen, wenn Sie nicht wissen, welche Spalte sortiert werden soll. Es ist sehr nützlich, wenn Sie eine generische Funktion schreiben möchten, bei der Sie den Typ der Klasse vorne nicht kennen.

0voto

Viktor Punkte 180

Es ist nicht notwendig, OrderBy anstelle von Where zu verwenden, in diesem Fall verlieren Sie Ihre where-Klausel.

Die OrderBy-Methode wird verwendet, um die Daten in aufsteigender Reihenfolge zu sortieren. Der wichtigste Punkt, den Sie im Auge behalten müssen, ist, dass diese Methode nicht die Daten ändern wird, sondern lediglich die Reihenfolge der Daten ändert.

Sie können also die OrderByDescending()- oder OrderBy()-Methode verwenden, um den Fehler zu vermeiden, den Sie erhalten.

Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
                    .OrderByDescending(p => p.ID) // oder einen anderen Tabellenspaltenwert zur Datenreihenfolge hinzufügen

oder

Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
                    .OrderBy(p => p.ID)

Sie können die OrderBy-Methode auf jeden Datentyp anwenden, d.h. Sie können Zeichen, Zeichenfolge, Dezimalzahl, Ganzzahl, usw. verwenden.

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