Wie kann ich eine Bestellung durchführen, indem ich die obige Syntax verwende, ohne die Extensionssyntax zu verwenden?
ein Komma zwischen den Bereichen Anwendung:
orderby a, b
Und was die orderby tut, tun orderby?
Wenn Sie orderby
zweimal hintereinander verwenden konzeptionell die Elemente zunächst die erste orderby
mit sortiert werden, und dann sortiert wieder die zweite orderby
verwenden. Da die Sortierung definiert ein stable sort (Objekte sein, die mit dem zweiten orderby
gebunden sind, werden in derselben Reihenfolge bleiben, nachdem sie mit dem ersten orderby
Sortier effektiv bedeutet dies, dass diese:
var query = from x in l
orderby x.A
orderby x.B
select x;
entspricht:
var query = from x in l
orderby x.B, x.A
select x;
Das Ergebnis ist, dass die orderby
Begriffe vertauscht sind von dem, was Sie wahrscheinlich gedacht.
Testen Sie es mit LINQ to SQL
Dies kann verifiziert werden, indem Sie es in LINQ to SQL versuchen. Ich habe die folgende Abfrage:
var query = from a in dc.Orders
orderby a.Date
orderby a.CustomerID
select a;
und dies war das generierte SQL:
SELECT [t0].[ID], [t0].[CustomerID], [t0].[Date], [t0].[Description]
FROM [dbo].[Order] AS [t0]
ORDER BY [t0].[CustomerID], [t0].[Date]
Beachten Sie, dass die orderby a.Date
nicht außer Acht gelassen wird. Beide Begriffe sind in der ORDER BY-Klausel enthalten, jedoch in der umgekehrten Reihenfolge, als Sie möglicherweise beabsichtigt haben.
Pro Spezifikation ist OrderBy immer eine stabile Sortierung (unabhängig vom LINQ-Provider). Das bedeutet: "Wenn die Schlüssel von zwei Elementen gleich sind, wird die Reihenfolge der Elemente beibehalten." Ob die angeketteten OrderBys die Reihenfolge beibehalten, hängt von den verwendeten Schlüsseln ab, nicht vom LINQ-Provider (obwohl dies offensichtlich die Schlüsselwerte beeinflusst). – hemp
@hemp: Nach der Forschung mehr, ich denke, Sie haben Recht. Seltsamerweise, obwohl Ihre eigene Antwort, wo Sie von MSDN zitieren ('Doing this führt eine neue primäre Reihenfolge ein, die die vorher festgelegte Reihenfolge ignoriert ') widerspricht dem, was Sie gerade in diesem Kommentar gesagt haben. Aber ich denke, dass seine MSDN falsch ist. –
Es widerspricht nicht direkt, es ist nur verwirrend. Es wird gesagt, dass die bestehende Bestellung von der neuen primären Bestellung nicht berücksichtigt wird. ** Allerdings **, wenn die neue Sortierung nach der ersten Sortierung gleichwertige Schlüsselwerte findet, werden diese nicht neu angeordnet. In der Tat sind beide Aussagen wahr, nur nicht sehr klar. – hemp