2010-05-25 19 views
27

Ich verwende die folgende Abfrage SyntaxLinq-to-SQL-orderby ThenBy

from table 
where 
where 
orderby 
orderby 

Wo der erste orderby ein Datum und zweite orderby ist ein Datum. Ich würde annehmen, dass das bis dahin funktioniert, scheint aber etwas anderes zu tun.

  1. Wie kann ich eine Bestellung ausführen, indem ich die obige Syntax ohne Verwendung der Extension-Syntax verwende? (Got it)

  2. Und was macht die orderby, orderby tun?

Antwort

43

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.

+0

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

+0

@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. –

+0

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

0

Die Antwort auf die ThenBy wie diese

sein sollte

orderby 1, 2

Ich werde Teil # 2 für jemand anderen verlassen.

8

Durchführen einer ThenBy in Query Expression Syntax straighforward ist, folgen Sie einfach den Anfangs orderby mit einem Komma und eine zweite Aussage:

// Create the data source. 
List<Student> students = GetStudents(); 

// Create the query. 
IEnumerable<Student> sortedStudents = 
    from student in students 
    orderby student.Last ascending, student.First ascending 
    select student; 

ein 2. orderby Anwendung der Standardabfrageoperatoren (Erweiterungsmethoden) unter Verwendung gilt tatsächlich die zweite orderby zum Ergebnis des Abfrageergebnisses, das die erste Bestellung enthält. Es gilt nur die zweite Reihenfolge, obwohl Sie immer noch die CPU-Zeit für die Berechnung der ersten Reihenfolge ausgeben.

Dies wird tatsächlich direkt in der MSDN documentation für die Methoden Enumerable.OrderBy und Enumerable.ThenBy beantwortet.

Da IOrderedEnumerable erbt von IEnumerable, können Sie Anruf SortiertNach oder OrderByDescending auf die Ergebnisse eines Aufrufs SortiertNach, OrderByDescending, ThenBy oder ThenByDescending. Dies führt führt eine neue primäre Bestellung, die ignoriert die zuvor festgelegten Bestellung.

7

Der Operator ThenBy wendet eine sekundäre, aufsteigende Sortierreihenfolge auf die Sequenz an. Es ist so ähnlich wie eine sekundäre Sortierreihenfolge in T-SQL wie zum Anwenden:

Select * from Customer order by FirstName,lastName 

In Linq können wir dies als schreiben:

var thenby = mode.CustList.Select(cus => new 
     { 
      cus. FirstName, 
      cus. LastName, 
      cus. EmailAddress 
     }).OrderBy(cus => cus. FirstName).ThenBy(cus => cus. LastName); 

Sie mehr dazu hier überprüfen: http://dotnetreaders.com/articles/ThenBy_in_LINQ_c-sharp,_Orderby_Thenby_in_LINQ_C-sharp/204

Verwandte Themen