如何用 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,看是否就是我们需要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值