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