Ich habe zwei Tabellen movies
und categories
und erhalte zuerst eine geordnete Liste nach Kategorie- ID und dann nach Name .
Die Filmtabelle enthält drei Spalten: ID, Name und CategoryID . Die Kategorietabelle hat zwei Spalten ID und Name .
Ich habe Folgendes versucht, aber es hat nicht funktioniert.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
linq
sql-order-by
Sasha
quelle
quelle
Antworten:
Dies sollte für Sie funktionieren:
quelle
Var movies = _db.Movies.Orderby(c => c.Category).ThenBy(n => n.Name)
wenn ichVar movies = _db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
2 mal "orderBy" benutze, warum ist das Ergebnis anders?ThenBy
?! ( Bearbeiten: sieht aus wie es in .NET 4.0 eingeführt wurde, was erklärt, wie es unbemerkt an mir vorbeiging.)Mit der Nicht-Lambda-Abfragesyntax LINQ können Sie Folgendes tun:
[BEARBEITEN, um Kommentar zu adressieren] Um die Sortierreihenfolge zu steuern, verwenden Sie die Schlüsselwörter
ascending
(dies ist die Standardeinstellung und daher nicht besonders nützlich) oderdescending
wie folgt :quelle
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. Richtiger istfrom row in _db.Movies orderby row.Category descending orderby row.Name select row
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. Die beiden von Ihnen bereitgestellten Snippets entsprechen einander und nicht den OPs.Neue hinzufügen":
Das funktioniert auf meiner Box. Es gibt etwas zurück, das zum Sortieren verwendet werden kann. Es gibt ein Objekt mit zwei Werten zurück.
Ähnlich, aber anders als beim Sortieren nach einer kombinierten Spalte wie folgt.
quelle
.OrderBy( m => new { m.CategoryID, m.Name })
und.OrderBy( m => new { m.Name, m.CategoryID })
werde die gleichen Ergebnisse erzielen, anstatt die beabsichtigte Priorität zu respektieren. Manchmal scheint es Ihnen rein zufällig die gewünschte Reihenfolge zu geben. Außerdemm.CategoryID.ToString() + m.Name
werden falsche Ordnungen erzeugt, wenn CategoryID eine istint
. Beispielsweise wird etwas mit id = 123, name = 5 mal nach id = 1234, name = etwas anstelle von vorher angezeigt. Es ist auch nicht ineffizient, Zeichenfolgenvergleiche durchzuführen, bei denen int-Vergleiche auftreten können.Verwenden Sie die folgende Zeile in Ihrem DataContext, um die SQL-Aktivität im DataContext in der Konsole zu protokollieren. Dann können Sie genau sehen, was Ihre linq-Anweisungen von der Datenbank anfordern:
Die folgenden LINQ-Anweisungen:
UND
Erstellen Sie die folgende SQL:
Während das Wiederholen eines OrderBy in Linq die resultierende SQL-Ausgabe umzukehren scheint:
UND
Erstellen Sie die folgende SQL (Name und CategoryId werden umgeschaltet):
quelle
Ich habe einige Erweiterungsmethoden erstellt (siehe unten), damit Sie sich keine Sorgen machen müssen, ob ein IQueryable bereits bestellt wurde oder nicht. Wenn Sie nach mehreren Eigenschaften bestellen möchten, gehen Sie wie folgt vor:
Dies ist besonders hilfreich, wenn Sie die Reihenfolge dynamisch erstellen, z. B. aus einer Liste von zu sortierenden Eigenschaften.
quelle
nullable datetime
Es gibt mindestens eine weitere Möglichkeit, dies mit LINQ zu tun, obwohl dies nicht die einfachste ist. Sie können dies mit der
OrberBy()
Methode tun , die ein verwendetIComparer
. Zuerst müssen Sie eineIComparer
für dieMovie
Klasse wie folgt implementieren :Dann können Sie die Filme mit der folgenden Syntax bestellen:
Wenn Sie die Reihenfolge für eines der Elemente auf absteigend ändern müssen, ändern Sie einfach das x und y innerhalb der
Compare()
Methode desMovieComparer
.quelle
MovieComparer
selbst erstellen . stattdessen kannst du tun_db.Movies.OrderBy(item => item, Comparer<Movie>.Create((x, y) => { if (x.CategoryId == y.CategoryId) { return x.Name.CompareTo(y.Name); } else { return x.CategoryId.CompareTo(y.CategoryId); } }));
. Wenn Sie die Logik lieber als einen Ausdruck anstatt alsif
... schreiben möchten, kannelse
die Lamda natürlich(x, y) => expr
einfacher sein.Wenn Sie ein generisches Repository verwenden
sonst
quelle