如何用 Linq 进行多重 Orderby ?

咨询区

  • Sasha

我有两张表:moviescategories,我想获取一个先按 categoryid 再按 Name 排序的list。

  1. movie 表有三个列:ID,Name,CategoryID

  2. category 表有两个列:ID,Name

我设想的伪代码如下:


var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })

回答区

  • Scott Stafford

不需要用 lambda 方式,可以用 查询词法 的形式,比如下面这样:


var movies = from row in _db.Movies 
             orderby row.Category, row.Name
             select row;
             

当然你也可以控制排序的方向,默认是升序 (ascending),你也可以改为降序 (descending),比如:


var movies = from row in _db.Movies 
             orderby row.Category descending, row.Name
             select row;

  • Alex

其实实现的方式有很多:

  1. 使用扩展方法 ThenBy 排序


var movies = _db.Movies.OrderBy(c => c.Category).ThenBy(n => n.Name)

  1. 使用匿名类型排序

因为匿名类是被重写过 Equals 和 GetHashcode 的,所以可以用来排序。


var movies = _db.Movies.OrderBy( m => new { m.CategoryID, m.Name })

  1. 拼接列名

还有一种排序方法,那就是将多个列拼接在一起,然后对复合列进行排序,参考如下代码:


var movies = _db.Movies.OrderBy( m => (m.CategoryID.ToString() + m.Name))

点评区

没想到对list进行二次排序还有这么多方法,学习了,如果是 Linq 查询数据库的话,建议多看看最终生成的sql,看是否就是我们需要的。