Definitivamente debe usar en ThenBy
lugar de múltiples OrderBy
llamadas.
Sugeriría esto:
tmp = invoices.InvoiceCollection
.OrderBy(o => o.InvoiceOwner.LastName)
.ThenBy(o => o.InvoiceOwner.FirstName)
.ThenBy(o => o.InvoiceID);
Observe cómo puede usar el mismo nombre cada vez. Esto también es equivalente a:
tmp = from o in invoices.InvoiceCollection
orderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceID
select o;
Si llama OrderBy
varias veces, efectivamente reordenará la secuencia por completo tres veces ... por lo que la llamada final será efectivamente la dominante. Usted puede (en LINQ a Objetos) de escritura
foo.OrderBy(x).OrderBy(y).OrderBy(z)
que sería equivalente a
foo.OrderBy(z).ThenBy(y).ThenBy(x)
ya que el orden de clasificación es estable, pero absolutamente no deberías:
- Es dificil de leer
- No funciona bien (porque reordena toda la secuencia)
- Es posible que no funcione en otros proveedores (por ejemplo, LINQ to SQL)
- Básicamente no es cómo
OrderBy
fue diseñado para ser utilizado.
El objetivo OrderBy
es proporcionar la proyección de orden "más importante"; luego use ThenBy
(repetidamente) para especificar proyecciones de pedidos secundarios, terciarios, etc.
Efectivamente, piénselo de esta manera: le OrderBy(...).ThenBy(...).ThenBy(...)
permite construir una sola comparación compuesta para cualquiera de los dos objetos, y luego ordenar la secuencia una vez usando esa comparación compuesta. Eso es casi seguro lo que quieres.