首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 3.0 入門系列(六):OrderBy 多欄位排序——ThenBy、ThenByDescending 與鏈結順序陷阱

     編輯:關於C語言

ThenBy / ThenByDescending:多欄位排序

查詢語法中以逗號分隔即為多欄位排序:

// 先依 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))。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved