查詢語法中以逗號分隔即為多欄位排序:
// 先依 City 升序,再依 ContactName 升序
var q = from c in db.Customers
orderby c.City, c.ContactName
select c;
// 先依 ShipCountry 升序,再依 Freight 降序
var q = from o in db.Orders
where o.EmployeeID == 1
orderby o.ShipCountry, o.Freight descending
select o;
對應的方法語法為:
var q = db.Customers
.OrderBy(c => c.City)
.ThenBy(c => c.ContactName)
.ToList();
關鍵點:T-SQL 沒有 ThenBy 關鍵字,一切皆轉為 ORDER BY 子句。若改用雙重 OrderBy,順序必須反過來寫:
// 錯誤:後面的 OrderBy 會覆蓋前面的
var q = db.Customers.OrderBy(c => c.City).OrderBy(c => c.ContactName);
// 正確:先排次要鍵,再排主要鍵
var q = db.Customers.OrderBy(c => c.ContactName).OrderBy(c => c.City);
降序版本同理:OrderByDescending + ThenByDescending。
OrderBy(c => c) 會拋出例外(除非在 LINQ to Objects 中實作 IComparable)。OrderBy(c => new { c.City, c.ContactName }) 不支援。Select(c => new { c.City, c.Address }).OrderBy(c => c) 同樣失敗,因匿名類型未實作比較介面。若需排序,前置投影應為基本型別(如 Select(c => c.City))。