Ich versuche, eine Liste der Produkte nach ihrem Preis zu sortieren.
Die Ergebnismenge muss Produkte nach Preis von niedrig nach hoch in der Spalte auflisten LowestPrice
. Diese Spalte ist jedoch nullwertfähig.
Ich kann die Liste in absteigender Reihenfolge wie folgt sortieren:
var products = from p in _context.Products
where p.ProductTypeId == 1
orderby p.LowestPrice.HasValue descending
orderby p.LowestPrice descending
select p;
// returns: 102, 101, 100, null, null
Ich kann jedoch nicht herausfinden, wie ich das in aufsteigender Reihenfolge sortieren soll.
// i'd like: 100, 101, 102, null, null
orderby p.LowestPrice ?? Int.MaxValue;
ist ein einfacher Weg.OrderByDescending, ThenBy
klarer.orderby
und wurde von der Seite verfolgt, um danach zu suchen :)Antworten:
Versuchen Sie, beide Spalten in die gleiche Reihenfolge zu bringen.
Andernfalls ist jede Bestellung ein separater Vorgang für die Sammlung, die jedes Mal neu bestellt wird.
Dies sollte zuerst diejenigen mit einem Wert ordnen, dann "dann" die Reihenfolge des Wertes.
quelle
orderby p.LowestPrice == null, p.LowestPrice ascending
Hoffnung hilft jemandem.Es ist sehr hilfreich, die LINQ-Abfragesyntax zu verstehen und zu verstehen, wie sie in LINQ-Methodenaufrufe übersetzt wird.
Es stellt sich heraus, dass
wird vom Compiler nach übersetzt
Dies ist nachdrücklich nicht das, was Sie wollen. Diese Art von
Product.LowestPrice.HasValue
indescending
Ordnung und dann neu sortiert die gesamte Kollektion vonProduct.LowestPrice
indescending
Ordnung.Was du willst ist
die Sie mit der Abfragesyntax von erhalten können
Einzelheiten zu den Übersetzungen von der Abfragesyntax zu Methodenaufrufen finden Sie in der Sprachspezifikation. Ernsthaft. Lies es.
quelle
Die Lösung für Zeichenfolgenwerte ist wirklich komisch:
Der einzige Grund, der funktioniert, ist, dass der erste Ausdruck Werte
OrderBy()
sortiertbool
:true
/false
.false
Das Ergebnis folgt zuerst demtrue
Ergebnis (nullables) undThenBy()
sortiert die Nicht-Null-Werte alphabetisch.Also mache ich lieber etwas Lesbareres wie dieses:
Wenn
SomeString
null ist, wird es durch ersetzt"z"
und sortiert dann alles alphabetisch.HINWEIS: Dies ist keine ultimative Lösung, da
"z"
zuerst Z-Werte wie zzebra
.UPDATE 9/6/2016 - Über @ jornhd Kommentar, es ist wirklich eine gute Lösung, aber es ist immer noch ein wenig komplex, daher werde ich empfehlen, es in eine Erweiterungsklasse wie diese zu packen:
Und verwenden Sie es einfach wie:
quelle
Ich habe in dieser Situation eine andere Option. Meine Liste ist objList und ich muss bestellen, aber am Ende müssen Nullen stehen. meine Entscheidung:
quelle
Ich habe versucht, eine LINQ-Lösung für dieses Problem zu finden, konnte es aber aus den Antworten hier nicht herausfinden.
Meine endgültige Antwort war:
quelle
meine Entscheidung:
quelle
Dies ist, was ich mir ausgedacht habe, weil ich Erweiterungsmethoden verwende und mein Element auch eine Zeichenfolge ist, also nein
.HasValue
:Dies funktioniert mit LINQ 2-Objekten im Speicher. Ich habe es nicht mit EF oder einem DB ORM getestet.
quelle
Im Folgenden finden Sie eine Erweiterungsmethode, mit der Sie nach Null suchen können, wenn Sie nach der untergeordneten Eigenschaft eines keySelector sortieren möchten.
Und verwenden Sie es einfach wie:
quelle
Hier ist ein anderer Weg:
SUP_APPROVED_IND is char(1) in Oracle db.
Beachten Sie, dass
r.SUP_APPROVED_IND.Trim() == null
behandelt wird alstrim(SUP_APPROVED_IND) is null
in Oracle db behandelt wird.Weitere Informationen finden Sie hier: Wie kann ich im Entity Framework nach Nullwerten fragen?
quelle
Eine weitere Option (war praktisch für unser Szenario):
Wir haben eine Benutzertabelle, die speichert
ADName, LastName, FirstName
Wir haben das Tabellenschema geändert und eine "SortIndex" -Spalte hinzugefügt, die einige Sortiergruppen definiert. (Wir haben eine Lücke von 5 gelassen, damit wir später Gruppen einfügen können.)
Nun, in Bezug auf die Abfrage wäre es:
in Methodenausdrücken:
was das erwartete Ergebnis ergibt:
quelle