Vous devriez certainement utiliser ThenBy
plutôt que plusieurs OrderBy
appels.
Je suggérerais ceci:
tmp = invoices.InvoiceCollection
.OrderBy(o => o.InvoiceOwner.LastName)
.ThenBy(o => o.InvoiceOwner.FirstName)
.ThenBy(o => o.InvoiceID);
Notez comment vous pouvez utiliser le même nom à chaque fois. Cela équivaut également à:
tmp = from o in invoices.InvoiceCollection
orderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceID
select o;
Si vous appelez OrderBy
plusieurs fois, cela réorganisera complètement la séquence trois fois ... donc l'appel final sera effectivement l'appel dominant. Vous pouvez (dans LINQ to Objects) écrire
foo.OrderBy(x).OrderBy(y).OrderBy(z)
ce qui équivaudrait à
foo.OrderBy(z).ThenBy(y).ThenBy(x)
car l'ordre de tri est stable, mais vous ne devriez absolument pas:
- C'est difficile à lire
- Il ne fonctionne pas bien (car il réorganise toute la séquence)
- Cela peut ne pas fonctionner avec d'autres fournisseurs (par exemple LINQ to SQL)
- Ce n'est essentiellement pas la façon dont il a
OrderBy
été conçu pour être utilisé.
Le but de OrderBy
est de fournir la projection d'ordre "la plus importante"; puis utilisez ThenBy
(à plusieurs reprises) pour spécifier des projections d'ordre secondaire, tertiaire, etc.
En fait, pensez-y de cette façon: OrderBy(...).ThenBy(...).ThenBy(...)
vous permet de créer une seule comparaison composite pour deux objets, puis de trier la séquence une fois en utilisant cette comparaison composite. C'est presque certainement ce que vous voulez.