Zdecydowanie powinieneś używać ThenBy
zamiast wielu OrderBy
połączeń.
Sugerowałbym to:
tmp = invoices.InvoiceCollection
.OrderBy(o => o.InvoiceOwner.LastName)
.ThenBy(o => o.InvoiceOwner.FirstName)
.ThenBy(o => o.InvoiceID);
Zwróć uwagę, jak za każdym razem możesz używać tej samej nazwy. Jest to również równoważne z:
tmp = from o in invoices.InvoiceCollection
orderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceID
select o;
Jeśli sprawdzisz OrderBy
wiele razy, skutecznie zmieni to kolejność całkowicie trzy razy ... więc ostateczne wezwanie będzie w rzeczywistości dominującym. Państwo może (w LINQ to Objects) zapisu
foo.OrderBy(x).OrderBy(y).OrderBy(z)
co byłoby równoważne z
foo.OrderBy(z).ThenBy(y).ThenBy(x)
ponieważ porządek sortowania jest stabilny, ale absolutnie nie powinieneś:
- Trudno to czytać
- Nie działa dobrze (ponieważ zmienia kolejność całej sekwencji)
- Może nie działać w innych dostawcach (np. LINQ to SQL)
- W zasadzie nie jest to sposób, w jaki
OrderBy
został zaprojektowany do użytku.
Chodzi o OrderBy
dostarczenie „najważniejszej” projekcji porządkującej; następnie użyj ThenBy
(wielokrotnie), aby określić projekcje zamawiania drugorzędnych, trzeciorzędnych itp.
Pomyśl o tym w ten sposób: OrderBy(...).ThenBy(...).ThenBy(...)
pozwala zbudować pojedyncze porównanie złożone dla dowolnych dwóch obiektów, a następnie posortować sekwencję raz, używając tego porównania złożonego. Prawie na pewno tego chcesz.