Вам определенно следует использовать, ThenByа не несколько OrderByвызовов.
Я бы предложил следующее:
tmp = invoices.InvoiceCollection
.OrderBy(o => o.InvoiceOwner.LastName)
.ThenBy(o => o.InvoiceOwner.FirstName)
.ThenBy(o => o.InvoiceID);
Обратите внимание, как вы можете использовать одно и то же имя каждый раз. Это также эквивалентно:
tmp = from o in invoices.InvoiceCollection
orderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceID
select o;
Если вы вызовете OrderByнесколько раз, он полностью переупорядочит последовательность три раза ... так что последний вызов будет фактически доминирующим. Вы можете (в LINQ to Objects) написать
foo.OrderBy(x).OrderBy(y).OrderBy(z)
что было бы эквивалентно
foo.OrderBy(z).ThenBy(y).ThenBy(x)
поскольку порядок сортировки стабилен, но вам категорически не следует:
- Трудно читать
- Он не работает (потому что меняет порядок всей последовательности)
- Это может не работать в других поставщиках (например, LINQ to SQL)
- По сути, это не так, как
OrderByбыло задумано для использования.
Смысл в OrderByтом, чтобы обеспечить «наиболее важную» упорядочивающую проекцию; затем используйте ThenBy(повторно), чтобы указать вторичные, третичные и т. д. упорядочивающие прогнозы.
Фактически, подумайте об этом так: OrderBy(...).ThenBy(...).ThenBy(...)позволяет вам построить одно составное сравнение для любых двух объектов, а затем один раз отсортировать последовательность, используя это составное сравнение. Это почти наверняка то, что вам нужно.