2010-05-25 14 views
27

używam następującą składnię zapytańLinq-sql orderby thenby

from table 
where 
where 
orderby 
orderby 

Jeżeli pierwsza orderby jest data i drugi orderby jest data. Zakładam, że to zadziała jak porządek, ale wydaje się, że robi coś innego.

  1. Jak mogę zrobić zamówienie przez użycie powyższej składni bez użycia składni rozszerzenia. (Rozumiem)

  2. Co robi zlecenie, zlecenie?

Odpowiedz

43

Jak mogę zrobić zamówienie przez użycie powyższej składni bez użycia składni rozszerzenia.

Używaj przecinka między polami:

orderby a, b 

A co robi orderby, orderby zrobić?

Po dwukrotnym użyciu orderby w rzędzie elementów koncepcyjnie najpierw sortowane za pomocą pierwszego orderby i sortowano następnie ponownie za pomocą drugiego orderby. Ponieważ sortowanie jest zdefiniowana jako stable sort (przedmioty, które są związane z drugą orderby pozostanie w tej samej kolejności po sortowaniu z pierwszym orderby skutecznie oznacza, że:

var query = from x in l 
      orderby x.A 
      orderby x.B 
      select x; 

odpowiada:

var query = from x in l 
      orderby x.B, x.A 
      select x; 

rezultatem jest to, że orderby terminy są zamienione z czego prawdopodobnie przeznaczony.

sprawdzając je za pomocą LINQ to SQL

Można to sprawdzić, wypróbowując w LINQ do SQL. I stworzył następujące zapytanie:

var query = from a in dc.Orders 
      orderby a.Date 
      orderby a.CustomerID 
      select a; 

i to było generowane SQL:

SELECT [t0].[ID], [t0].[CustomerID], [t0].[Date], [t0].[Description] 
FROM [dbo].[Order] AS [t0] 
ORDER BY [t0].[CustomerID], [t0].[Date] 

Zauważ, że orderby a.Date nie jest ignorowany. Oba terminy są zawarte w klauzuli ORDER BY, ale w odwrotnej kolejności, niż zamierzałeś.

+0

Według specyfikacji, OrderBy jest zawsze stabilnym sortem (niezależnie od dostawcy LINQ). Oznacza to, że "jeśli klucze dwóch elementów są równe, kolejność elementów jest zachowana." To, czy łańcuchowe OrderBy zachowa porządek, zależy od używanych kluczy, nie od dostawcy LINQ (choć oczywiście wpłynie to na kluczowe wartości). – hemp

+0

@hemp: Po reasearching it more, myślę, że masz rację. O dziwo, twoja własna odpowiedź, w której cytujesz z MSDN ("Robi to wprowadza nową podstawową kolejność, która ignoruje wcześniej ustaloną kolejność.) Jest sprzeczna z tym, co właśnie powiedziałeś w tym komentarzu. Ale myślę, że jego MSDN jest źle. –

+0

To nie jest wprost sprzeczne, tylko mylące. Mówi się, że istniejące zamówienie nie zostanie uwzględnione w nowym zamówieniu głównym. ** Jednak **, gdy zastosuje początkowe zamówienie, jeśli nowe zamówienie uzna wartości kluczy za równe, nie zmieni kolejności tych pozycji. W rzeczywistości oba stwierdzenia są prawdziwe, ale nie bardzo jasne. – hemp

0

Odpowiedź na thenby powinno być jak ten

orderby 1, 2

Zostawię część nr 2 dla kogoś innego.

8

Wykonywanie ThenBy w Query Expression Syntax jest straighforward, wystarczy wykonać wstępną orderby z przecinkiem i 2. oświadczenie:

// 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; 

wprowadzającego 2nd orderby przy użyciu standardowych operatorów zapytań (rozszerzenie metod) będzie faktycznie nanieść drugą orderby do wyniku zapytania, który obejmuje pierwszy porządek. W efekcie obowiązywać będzie tylko kolejność drugiego rzędu, choć nadal będziesz potrzebować czasu procesora obliczającego pierwsze zamówienie.

To jest odpowiedź bezpośrednio w MSDN documentation dla metod Enumerable.OrderBy and Enumerable.ThenBy.

Ponieważ IOrderedEnumerable dziedziczy z IEnumerable, możesz wywołanie OrderBy lub OrderByDescending na wyników wywołanie OrderBy, OrderByDescending, ThenBy lub ThenByDescending. Wykonanie tego wprowadza nową podstawową kolejność, która ignoruje wcześniej ustaloną kolejność .

7

Operator ThenBy stosuje drugorzędną, rosnącą kolejność sortowania. To jest zbliżona do stosowania wtórnej porządek w T-SQL, takich jak:

Select * from Customer order by FirstName,lastName 

w LINQ możemy napisać to jako:

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

Można sprawdzić, więcej na ten temat tutaj: http://dotnetreaders.com/articles/ThenBy_in_LINQ_c-sharp,_Orderby_Thenby_in_LINQ_C-sharp/204