Dovresti assolutamente usare ThenBy
piuttosto che più OrderBy
chiamate.
Suggerirei questo:
tmp = invoices.InvoiceCollection
.OrderBy(o => o.InvoiceOwner.LastName)
.ThenBy(o => o.InvoiceOwner.FirstName)
.ThenBy(o => o.InvoiceID);
Nota come puoi usare lo stesso nome ogni volta. Questo è anche equivalente a:
tmp = from o in invoices.InvoiceCollection
orderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceID
select o;
Se chiami OrderBy
più volte, riordinerà effettivamente la sequenza completamente tre volte ... quindi la chiamata finale sarà effettivamente quella dominante. È possibile (in LINQ to Objects) scrivere
foo.OrderBy(x).OrderBy(y).OrderBy(z)
che sarebbe equivalente a
foo.OrderBy(z).ThenBy(y).ThenBy(x)
poiché l'ordinamento è stabile, ma non dovresti assolutamente:
- È difficile da leggere
- Non funziona bene (perché riordina l'intera sequenza)
- Potrebbe non funzionare in altri provider (ad esempio LINQ to SQL)
- Fondamentalmente non è come è
OrderBy
stato progettato per essere utilizzato.
Lo scopo di OrderBy
è fornire la proiezione di ordinamento "più importante"; quindi utilizzare ThenBy
(ripetutamente) per specificare le proiezioni di ordinamento secondarie, terziarie ecc.
In effetti, pensala in questo modo: OrderBy(...).ThenBy(...).ThenBy(...)
ti consente di creare un singolo confronto composito per due oggetti qualsiasi, quindi ordinare la sequenza una volta utilizzando quel confronto composito. Quasi certamente è quello che vuoi.