Вам неодмінно слід використовувати 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(...)
дозволяє побудувати єдине складене порівняння для будь-яких двох об'єктів, а потім сортувати послідовність один раз, використовуючи це складене порівняння. Це майже точно, що ви хочете.