錯誤寫法
// 錯誤:後面的 orderby 會覆蓋前面的
var q = from p in db orderby p.score orderby p.name select p;
// 錯誤:匿名類型無法直接比較排序
var q = from p in db orderby new { p.score, p.name } select p;
正確寫法:ThenBy / ThenByDescending
// 方法語法 (推薦)
var query = dbContext.Users
.OrderBy(u => u.Score) // 主排序:積分升序
.ThenBy(u => u.Name); // 次排序:姓名升序
// 降序組合
var query = dbContext.Users
.OrderByDescending(u => u.Score)
.ThenBy(u => u.Name);
// 查詢語法
var query = from u in dbContext.Users
orderby u.Score, u.Name
select u;
原理
OrderBy 返回 IOrderedQueryable,只有它才有 ThenBy 方法。
- 多個
orderby 子句在查詢語法中用逗號分隔,編譯器自動轉為 OrderBy/ThenBy 鏈。
- 匿名類型
new { A, B } **不實現 IComparable**,無法直接用於排序。
動態排序 (字符串字段名)
// System.Linq.Dynamic.Core (NuGet)
var query = dbContext.Users.OrderBy("Score desc, Name asc");