Você definitivamente deve usar ThenBy
e não várias OrderBy
chamadas.
Eu sugeriria isso:
tmp = invoices.InvoiceCollection
.OrderBy(o => o.InvoiceOwner.LastName)
.ThenBy(o => o.InvoiceOwner.FirstName)
.ThenBy(o => o.InvoiceID);
Observe como você pode usar o mesmo nome toda vez. Isso também é equivalente a:
tmp = from o in invoices.InvoiceCollection
orderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceID
select o;
Se você ligar OrderBy
várias vezes, ele efetivamente reordenará a sequência completamente três vezes ... para que a chamada final seja efetivamente a dominante. Você pode (no LINQ to Objects) escrever
foo.OrderBy(x).OrderBy(y).OrderBy(z)
o que seria equivalente a
foo.OrderBy(z).ThenBy(y).ThenBy(x)
como a ordem de classificação é estável, mas você absolutamente não deve:
- É difícil de ler
- Não funciona bem (porque reordena toda a sequência)
- Pode não funcionar em outros provedores (por exemplo, LINQ to SQL)
- Basicamente, não é como
OrderBy
foi projetado para ser usado.
O objetivo de OrderBy
é fornecer a projeção de pedidos "mais importante"; use ThenBy
(repetidamente) para especificar projeções secundárias, terciárias, etc.
Efetivamente, pense dessa maneira: OrderBy(...).ThenBy(...).ThenBy(...)
permite criar uma única comparação composta para dois objetos e, em seguida, classifique a sequência uma vez usando essa comparação composta. Isso é quase certamente o que você deseja.