Vous devriez certainement utiliser ThenByplutôt que plusieurs OrderByappels.
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 OrderByplusieurs 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 OrderByest 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.