Вам неодмінно слід використовувати 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 до об'єктів) писати
foo.OrderBy(x).OrderBy(y).OrderBy(z)
що було б рівнозначно
foo.OrderBy(z).ThenBy(y).ThenBy(x)
оскільки порядок сортування стабільний, але ви абсолютно не повинні:
- Це важко читати
- Це не дуже добре (тому що вона переробляє всю послідовність)
- Він може не працювати в інших постачальників (наприклад, LINQ до SQL)
- Це в основному не те, як
OrderByбуло розроблено для використання.
Сенс OrderByполягає у наданні "найважливішої" замовлення проекції; потім використовуйте ThenBy(повторно) для вказівки вторинних, третинних тощо замовлення проекцій.
Ефективно, подумайте про це так: OrderBy(...).ThenBy(...).ThenBy(...)дозволяє побудувати єдине складене порівняння для будь-яких двох об'єктів, а потім сортувати послідовність один раз, використовуючи це складене порівняння. Це майже точно, що ви хочете.